15

下面Test_Click是在 UI 线程上运行的简化版代码(使用WindowsFormsSynchronizationContext):

void Test_Click(object sender, EventArgs e)
{
    var task = DoNavigationAsync();
    task.ContinueWith((t) =>
    {
        MessageBox.Show("Navigation done!");
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

我是否应该明确指定TaskScheduler.FromCurrentSynchronizationContext()以确保继续操作将在同一个 UI 线程上执行?还是ContinueWith自动捕获执行上下文(因此,TaskScheduler在这种情况下使参数变得多余)?

我认为默认情况下它不会这样做(与 不同await),但到目前为止我找不到在线资源来确认这一点。

4

1 回答 1

10

它默认不使用当前的同步上下文,但是TaskScheduler.Current,如下面的反编译代码所示:

public Task ContinueWith(Action<Task<TResult>> continuationAction)
{
  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
  return this.ContinueWith(continuationAction, TaskScheduler.Current, new CancellationToken(), TaskContinuationOptions.None, ref stackMark);
}

TaskScheduler.Current如果任务是TaskScheduler.Default子任务,则为当前任务的 TaskScheduler。如果您不想遇到奇怪的问题await,请始终指定任务调度程序,或者如果可以的话,最好使用。

于 2013-08-19T11:51:17.867 回答