在下面的问题中,我发现了以类型安全的方式调用QueueUserWorkItem的巧妙技巧,您可以在其中传递委托而不是WaitCallBack和对象.但是,它并不像人们期望的那样工作.
QueueUserWorkItem()和BeginInvoke()之间的区别是什么,用于执行不需要返回类型的异步活动
以下是一些演示此问题的示例代码和输出.
for (int i = 0; i < 10; ++i)
{
// doesn't work - somehow DoWork is invoked with i=10 each time!!!
ThreadPool.QueueUserWorkItem(delegate { DoWork("closure", i); });
// not type safe, but it works
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), Tuple.Create(" WCB", i));
}
void DoWork(string s, int i)
{
Console.WriteLine("{0} - i:{1}", s, i);
}
void DoWork(object state)
{
var t = (Tuple<string, int>)state;
DoWork(t.Item1, t.Item2);
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
closure - i:10
WCB - i:0
closure - i:10
WCB - i:2 …Run Code Online (Sandbox Code Playgroud)