赤道上的小熊又来了,在使用委托异步编程时,如果需要循环开启N个线程,会出现一个不定时异常(回调函数的IAsyncResult 为NULL),采用下列方法可解决该问题,如下
public class Class2
{
public delegate string AsynchronousTask(string threadName);//定义委托
AsynchronousTask asynchronousTask;//委托变量
public Class2()
{
asynchronousTask = ExeMthod ;//【3】将委托与执行方法关联
}
public void Exe()
{
List<IAsyncResult> taskList = new List<IAsyncResult>();
//2、开启线程
for (int i = 1; i < 10; i++)
{
IAsyncResult result = asynchronousTask.BeginInvoke((i*10).ToString (), CallBack, i.ToString ());
}
List<Task> lista = new List<Task>();
lista.Add(Task.Run(() =>
{
foreach (IAsyncResult item in taskList)
{
item.AsyncWaitHandle.WaitOne();
}
}));
//3、一组计划完成时执行
Task.Factory.ContinueWhenAll(lista.ToArray(), t =>
{
Console.WriteLine(" 一组计划执行完成:");
});
}
private string ExeMthod(string strPlanID) //执行的方法
{
System.Threading.Thread.Sleep(5000);//延时5秒
return ((strPlanID).ToString());
}
private void CallBack(IAsyncResult ar) //回调函数
{
string strRes = asynchronousTask.EndInvoke(ar);//执行结果
string strPlan = (string )ar.AsyncState; //计划ID
Console.WriteLine("线程ID " + Thread.CurrentThread.ManagedThreadId + "----"+strPlan+ " 回调函数结果:" + strRes);
}
}