由于我理解Task嵌套任务的上下文,我真的不明白 - 为什么第二次打印之前的第三次打印?
即使我已经使用过Task.WaitAll(t),它也会在第二行之前打印第3行.
码:
public static void Main()
{
Task t = new Task(
() =>
{
Thread.Sleep(2000);
Console.WriteLine("1st print...");
});
t.ContinueWith(
x =>
{
Thread.Sleep(2000);
Console.WriteLine("2nd print...");
},
TaskContinuationOptions.OnlyOnRanToCompletion);
t.Start();
Task.WaitAll(t);
Console.WriteLine("3rd print...");
Console.Read();
}
Run Code Online (Sandbox Code Playgroud)
输出:

请考虑以下代码.我开始执行一个什么都不做的任务,然后使用ContinueWith()开始对一个递增计数器的方法进行10次调用.
当我运行该程序时,它打印"0",表示还没有调用increment()方法.我期待它被调用10次,因为那是我调用ContinueWith()的次数.
如果我取消注释"Thread.Sleep(20)"行,则按预期打印"10".
这在发布或调试模式下发生.我的系统是运行Windows 7 x64的超级线程(8个逻辑核心)的核心2 quad.
我假设我对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;
}
} …Run Code Online (Sandbox Code Playgroud)