C#异步调用(Asynchronou Delegate)
C#异步调用获取结果方法:主要有三种,也可以说是四种(官方说四种,电子书说三种),官方在MSDN上已经有详细的说明: 链接
需要了解到获取异步执行的返回值,意味着你需要调用Delegate的BeginInvoke方法,而不是Invoke方法。
第一种就是书上没有说的,但是官方还是给出来的,就是通过调用EndInvoke方法来获取内容,查看如下代码:
class MyState
{
public int ThreadId = 0;
public int Data = 0;
public MyState()
{
}
}
class AsyncInvoke
{
private MyState State = null;
public AsyncInvoke()
{
State = new MyState();
}
private int TakesAWhile(int data, int ms)
{
Console.WriteLine("TakesAWhile started");
Thread.Sleep(ms);
Console.WriteLine("TakesAWhile completed");
return ++data;
}
public delegate int TakesAWhileDelegate(int data, int ms);
public void RunEndInvoke()
{
TakesAWhileDelegate dl = new TakesAWhileDelegate(TakesAWhile);
IAsyncResult ar = dl.BeginInvoke(5, 3000, null, null);
int result = 0;
result = dl.EndInvoke(ar);
Console.WriteLine(string.Format("Result: {0}", result));
}
}
输出结果为:
TakesAWhile started
TakesAWhile completed
Result: 6
通过上面可以知道使用EndInvoke阻塞了主线程(RunEndInvoke函数),同时需要使用BeginInvoke的返回值ar作为EndInvoke的入参。
第二种方法Polling(轮询)BeginInvoke的返回值(IAsyncResult中的属性IsCompleted),将RunEndInvoke替换成下面的函数RunPolling:
public void RunPolling()
{
TakesAWhileDelegate dl = new TakesAWhileDelegate(TakesAWhile);
IAsyncResult ar = dl.BeginInvoke(5, 3000, null, null);
while (ar.IsCompleted == false)
{
Thread.Sleep(500);
}
int result = 0;
result