不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
ManualResetEvent类用法小结
编辑:dnawo 日期:2014-08-18
假设有一个程序中调用了三个异步方法,代码如下:
执行结果如下图所示:

也就是说,异步方法的执行顺序是不固定的,但有时我们希望它们能按顺序执行,修改代码如下:
看着有没有感觉很乱?能不能让代码既像开始那样有条理,又能按顺序执行呢?ManualResetEvent类出场了:
复制内容到剪贴板
程序代码

public class Test
{
public void Todo(string message)
{
Console.WriteLine("{0} {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);
}
private Action<string> _todo = null;
public Test()
{
_todo = Todo;
}
public IAsyncResult BeginTodo(string message, AsyncCallback callback, object state)
{
return _todo.BeginInvoke(message, callback, state);
}
public void EndTodo(IAsyncResult ar)
{
_todo.EndInvoke(ar);
}
}
public class Program
{
static void callback1(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static void callback2(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static void callback3(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static public void Main(string[] args)
{
Test test1 = new Test();
test1.BeginTodo("test1", callback1, test1);
Test test2 = new Test();
test2.BeginTodo("test2", callback2, test2);
Test test3 = new Test();
test3.BeginTodo("test3", callback3, test3);
Console.ReadKey();
}
}
{
public void Todo(string message)
{
Console.WriteLine("{0} {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);
}
private Action<string> _todo = null;
public Test()
{
_todo = Todo;
}
public IAsyncResult BeginTodo(string message, AsyncCallback callback, object state)
{
return _todo.BeginInvoke(message, callback, state);
}
public void EndTodo(IAsyncResult ar)
{
_todo.EndInvoke(ar);
}
}
public class Program
{
static void callback1(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static void callback2(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static void callback3(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static public void Main(string[] args)
{
Test test1 = new Test();
test1.BeginTodo("test1", callback1, test1);
Test test2 = new Test();
test2.BeginTodo("test2", callback2, test2);
Test test3 = new Test();
test3.BeginTodo("test3", callback3, test3);
Console.ReadKey();
}
}
执行结果如下图所示:

也就是说,异步方法的执行顺序是不固定的,但有时我们希望它们能按顺序执行,修改代码如下:
复制内容到剪贴板
程序代码

public class Program
{
static void callback1(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
Test test2 = new Test();
test2.BeginTodo("test2", callback2, test2);
}
static void callback2(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
Test test3 = new Test();
test3.BeginTodo("test3", callback3, test3);
}
static void callback3(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static public void Main(string[] args)
{
Test test1 = new Test();
test1.BeginTodo("test1", callback1, test1);
Console.ReadKey();
}
}
{
static void callback1(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
Test test2 = new Test();
test2.BeginTodo("test2", callback2, test2);
}
static void callback2(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
Test test3 = new Test();
test3.BeginTodo("test3", callback3, test3);
}
static void callback3(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
}
static public void Main(string[] args)
{
Test test1 = new Test();
test1.BeginTodo("test1", callback1, test1);
Console.ReadKey();
}
}
看着有没有感觉很乱?能不能让代码既像开始那样有条理,又能按顺序执行呢?ManualResetEvent类出场了:
复制内容到剪贴板
程序代码

public class Program
{
static ManualResetEvent done1 = new ManualResetEvent(false);
static ManualResetEvent done2 = new ManualResetEvent(false);
static ManualResetEvent done3 = new ManualResetEvent(false);
static void callback1(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
done1.Set();
}
static void callback2(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
done2.Set();
}
static void callback3(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
done3.Set();
}
static public void Main(string[] args)
{
Test test1 = new Test();
test1.BeginTodo("test1", callback1, test1);
done1.WaitOne(); //阻塞当前线程,待Set后继续执行
Test test2 = new Test();
test2.BeginTodo("test2", callback2, test2);
done2.WaitOne(); //阻塞当前线程,待Set后继续执行
Test test3 = new Test();
test3.BeginTodo("test3", callback3, test3);
done3.WaitOne(); //阻塞当前线程,待Set后继续执行
Console.ReadKey();
}
}
{
static ManualResetEvent done1 = new ManualResetEvent(false);
static ManualResetEvent done2 = new ManualResetEvent(false);
static ManualResetEvent done3 = new ManualResetEvent(false);
static void callback1(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
done1.Set();
}
static void callback2(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
done2.Set();
}
static void callback3(IAsyncResult ar)
{
Test test = (Test)ar.AsyncState;
test.EndTodo(ar);
done3.Set();
}
static public void Main(string[] args)
{
Test test1 = new Test();
test1.BeginTodo("test1", callback1, test1);
done1.WaitOne(); //阻塞当前线程,待Set后继续执行
Test test2 = new Test();
test2.BeginTodo("test2", callback2, test2);
done2.WaitOne(); //阻塞当前线程,待Set后继续执行
Test test3 = new Test();
test3.BeginTodo("test3", callback3, test3);
done3.WaitOne(); //阻塞当前线程,待Set后继续执行
Console.ReadKey();
}
}






评论: 0 | 引用: 0 | 查看次数: 3769
发表评论
请登录后再发表评论!