【问题标题】:ThreadPool.QueueUserWorkItem -- is new WaitCallback() required?ThreadPool.QueueUserWorkItem - 是否需要新的 WaitCallback()?
【发布时间】:2013-03-29 01:17:46
【问题描述】:

我看到的 90% 的示例,包括 MSDN 都使用这种语法:

ThreadPool.QueueUserWorkItem(new WaitCallback(MyCallback));

另外 10% 使用:

ThreadPool.QueueUserWorkItem(MyCallback);

在这两种情况下,MyCallback 都是静态函数。

编译器没有给出错误,并且代码似乎可以正常工作。不创建新的 WaitCallback 对象而直接传递函数有什么危险吗?

我问是因为我试图找出我的代码中的一些错误,一旦我缩小范围,我会用更具体的问题来解决这些问题,但也是这个一般性问题,因为我一直很好奇并且找不到任何答案。我找到的最接近的是:

http://msdn.microsoft.com/en-us/library/4yd16hza%28v=vs.90%29.aspx

其中规定:

"Visual Basic 用户可以省略 WaitCallback 构造函数,只需 将回调方法传递给时使用 AddressOf 运算符 队列用户工作项。 Visual Basic 自动调用正确的 委托构造函数。”

...但实际上并没有说“C# 用户必须使用构造函数”,我也想知道为什么/details。我正在使用 .NET 3.5。

【问题讨论】:

    标签: c# .net multithreading threadpool


    【解决方案1】:
    ThreadPool.QueueUserWorkItem(new WaitCallback(MyCallback));
    

    ThreadPool.QueueUserWorkItem(MyCallback);
    

    是等价的并且被编译成相同的字节码。编译器会为您插入 new WaitCallback 调用。

    来自MSDN

    Del<int> m1 = new Del<int>(Notify);
    

    C# 2.0 版有一个称为方法组转换的新功能,它适用于具体的和通用的委托类型,并使您能够使用这种简化的语法编写上一行:

    Del<int> m2 = Notify;
    

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 2017-04-09
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2019-01-06
      • 2021-09-30
      • 1970-01-01
      相关资源
      最近更新 更多