考虑以下代码。我从一个不执行任何操作的任务开始,然后使用ContinueWith() 启动对递增计数器的方法的10 次调用。
当我运行这个程序时,它打印“0”,表明increment()方法根本没有被调用。我预计它会被调用 10 次,因为这就是我调用ContinueWith() 的次数。
如果我取消注释“Thread.Sleep(20)”行,那么它会按预期打印“10”。
这种情况发生在发布或调试模式下。我的系统是一个具有超线程(8 个逻辑核心)的 2 核四核系统,运行 Windows 7 x64。
我认为我对 Task.ContinueWith() 的工作原理有某种根本性的误解......
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main()
{
using (var task = Task.Factory.StartNew(()=>{}))
{
for (int i = 0; i < 10; ++i)
{
task.ContinueWith(_=> increment());
// Thread.Sleep(20); // Uncomment to print 10 instead of 0.
}
task.Wait();
}
// This prints 0 UNLESS you uncomment the sleep above.
Console.WriteLine(counter);
}
static void increment()
{
Interlocked.Increment(ref counter);
}
private static int counter;
}
}
任何人都可以阐明这里发生的事情吗?
原因很简单:您等待已经完成的任务。您真正想要的是等待您在循环中创建的十个任务:
var tasks = new List<Task>();
for (int i = 0; i < 10; ++i)
{
tasks.Add(task.ContinueWith(_=> increment()));
}
Task.WaitAll(tasks.ToArray());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)