连续的 ContinueWith 语句
Consecutive ContinueWith statements
我有
System.Threading.Tasks.Task.Factory.StartNew (() => {
doSomething();
}).ContinueWith (t => {
doSomething2();
}).ContinueWith (x => {
doSomething3();
}, TaskScheduler.FromCurrentSynchronizationContext ());
这些方法是按顺序执行的吗?即,doSomething()
被执行,一旦完成,doSomething2()
开始,一旦完成,doSomething3()
开始
如果不是按顺序执行,有没有更好的方法呢?
正确。它将始终按顺序执行。只有在调用任务完成后,ContinueWith 才会 运行。
Creates a continuation that executes asynchronously when the target Task completes and returns a value.
对于这类问题,一个简单的方法是编写一个快速测试:
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
Console.WriteLine("{0}: Starting Main: Thread ID {1}", DateTime.Now.TimeOfDay, Thread.CurrentThread.ManagedThreadId);
var finalTask = Task.Delay(500)
.ContinueWith(_ => {
Console.WriteLine("{0}: First Continue With: Task ID {1}, Thread ID {2}", DateTime.Now.TimeOfDay, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
})
.ContinueWith(_ => {
Console.WriteLine("{0}: Second Continue With: Task ID {1}, Thread ID {2}", DateTime.Now.TimeOfDay, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
});;
finalTask.Wait();
Console.WriteLine("{0}: Finished!", DateTime.Now.TimeOfDay);
}
}
这会产生以下结果。通过查看时间,这证实了第二个 ContinueWith
仅在第一个完成后发生。
02:03:16.1360139: Starting Main: Thread ID 107
02:03:16.6407471: First Continue With: Task ID 1, Thread ID 272
02:03:17.6514780: Second Continue With: Task ID 2, Thread ID 272
02:03:18.6592219: Finished!
我有
System.Threading.Tasks.Task.Factory.StartNew (() => {
doSomething();
}).ContinueWith (t => {
doSomething2();
}).ContinueWith (x => {
doSomething3();
}, TaskScheduler.FromCurrentSynchronizationContext ());
这些方法是按顺序执行的吗?即,doSomething()
被执行,一旦完成,doSomething2()
开始,一旦完成,doSomething3()
开始
如果不是按顺序执行,有没有更好的方法呢?
正确。它将始终按顺序执行。只有在调用任务完成后,ContinueWith 才会 运行。
Creates a continuation that executes asynchronously when the target Task completes and returns a value.
对于这类问题,一个简单的方法是编写一个快速测试:
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
Console.WriteLine("{0}: Starting Main: Thread ID {1}", DateTime.Now.TimeOfDay, Thread.CurrentThread.ManagedThreadId);
var finalTask = Task.Delay(500)
.ContinueWith(_ => {
Console.WriteLine("{0}: First Continue With: Task ID {1}, Thread ID {2}", DateTime.Now.TimeOfDay, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
})
.ContinueWith(_ => {
Console.WriteLine("{0}: Second Continue With: Task ID {1}, Thread ID {2}", DateTime.Now.TimeOfDay, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
});;
finalTask.Wait();
Console.WriteLine("{0}: Finished!", DateTime.Now.TimeOfDay);
}
}
这会产生以下结果。通过查看时间,这证实了第二个 ContinueWith
仅在第一个完成后发生。
02:03:16.1360139: Starting Main: Thread ID 107
02:03:16.6407471: First Continue With: Task ID 1, Thread ID 272
02:03:17.6514780: Second Continue With: Task ID 2, Thread ID 272
02:03:18.6592219: Finished!