Gra*_*ton 9 .net multithreading
我读了Use AsyncCallback,有这段代码:
using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;
class MainClass
{
delegate int MyDelegate(string s);
static void Main(string[] args)
{
MyDelegate X = new MyDelegate(DoSomething);
AsyncCallback cb = new AsyncCallback(DoSomething2);
IAsyncResult ar = X.BeginInvoke("Hello", cb, null);
Console.WriteLine("Press any key to continue");
Console.ReadLine();
}
static int DoSomething(string s)
{
Console.WriteLine("doooooooooooooooo");
return 0;
}
static void DoSomething2(IAsyncResult ar)
{
MyDelegate X = (MyDelegate)((AsyncResult)ar).AsyncDelegate;
X.EndInvoke(ar);
}
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是在DoSomething2,这是一个AsyncCallback,委托明确由命令杀死EndInvoke.
这真的有必要吗?因为AsyncCallback除非并且直到委托方法完成运行,否则不会被调用.
调用EndInvoke()非常重要.如果后台方法生成异常,则调用EndInvoke()将引发该异常,允许主线程处理它.此外,如果后台方法具有返回值,则主线程需要调用EndInvoke()来检索该值.
如果您的后台线程属于这些情况之一(生成异常或具有返回值)并且您没有调用EndInvoke(),那么后台线程将不会被释放 - 实际上导致资源泄漏.
| 归档时间: |
|
| 查看次数: |
2603 次 |
| 最近记录: |