考虑以下代码。我从一个什么都不做的任务开始,然后使用ContinueWith()来启动10个调用一个增加计数器的方法的任务。
当我运行这个程序时,它打印“0”,表示增量(increment)方法根本没有被调用。我原本期望这个方法被调用10次,因为我调用了10次ContinueWith()。
如果我取消注释“Thread.Sleep(20)”这一行,那么就会按预期打印“10”。
这种情况在发布模式和调试模式下都会发生。我的系统是带有超线程技术(8个逻辑核心)的核2四核处理器,运行Windows 7 x64。
我认为我对Task.ContinueWith()的工作方式存在某种基本误解....
当我运行这个程序时,它打印“0”,表示增量(increment)方法根本没有被调用。我原本期望这个方法被调用10次,因为我调用了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;
}
}
有人能够解释一下这里到底发生了什么吗?