小编Jes*_*sse的帖子

带委托的QueueUserWorkItem不起作用,但WaitCallBack确实有效

在下面的问题中,我发现了以类型安全的方式调用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)

c# multithreading delegates

4
推荐指数
1
解决办法
3377
查看次数

标签 统计

c# ×1

delegates ×1

multithreading ×1