c# - Task.ContinueWith 是否捕获调用线程上下文以继续?

标签 c# .net asynchronous task-parallel-library async-await

下面的 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 不同),但到目前为止我找不到在线资源来确认这一点。

最佳答案

它默认不使用当前同步上下文,而是使用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.CurrentTaskScheduler.Default 或当前任务的 TaskScheduler(如果任务是子任务)。如果不想遇到 weird problems,请始终指定任务计划程序,或者更好,如果可以,请使用 await

关于c# - Task.ContinueWith 是否捕获调用线程上下文以继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18312695/

相关文章:

c# - 转换器没有被调用

c# - 获取列表框中所选项目的值作为字符串

c# - setter 上的“System.StackOverflowException”

asynchronous - 使用 nock 在异步操作创建者中测试 POST 请求

servlets - 有关在Grails中进行异步处理的简单方法的建议

c# - 实现下拉列表模型的正确方法 .Net Core

c# - 枚举命名约定 - 复数

c# - Entity Framework 使用大量内存

c# - .NET 3.5 C# StreamReader 读取 ISO-8859-1 字符不正确

java - 为什么我无法在@Async 方法中取回结果? ("IllegalStateException: EntityManagerFactory is closed"被抛出)