是否应该始终在AsyncCallback中调用EndInvoke委托?

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除非并且直到委托方法完成运行,否则不会被调用.

STW*_*STW 7

调用EndInvoke()非常重要.如果后台方法生成异常,则调用EndInvoke()将引发该异常,允许主线程处理它.此外,如果后台方法具有返回值,则主线程需要调用EndInvoke()来检索该值.

如果您的后台线程属于这些情况之一(生成异常或具有返回值)并且您没有调用EndInvoke(),那么后台线程将不会被释放 - 实际上导致资源泄漏.