首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我原以为等待者和调用者在同一条线上继续等待,但似乎并非如此。

我原以为等待者和调用者在同一条线上继续等待,但似乎并非如此。
EN

Stack Overflow用户
提问于 2014-02-17 20:27:02
回答 3查看 6.7K关注 0票数 29

我认为异步/等待的要点之一是,当任务完成时,在调用等待时在相同的上下文上运行延续,在我的例子中,这个上下文将是UI线程。

例如:

代码语言:javascript
复制
Debug.WriteLine("2: Thread ID: " + Thread.CurrentThread.ManagedThreadId);
await fs.ReadAsync(data, 0, (int)fs.Length);
Debug.WriteLine("3: Thread ID: " + Thread.CurrentThread.ManagedThreadId);

我不期望这样做:

代码语言:javascript
复制
2: Thread ID: 10
3: Thread ID: 11

怎么回事?为什么连续性的线程ID与UI线程不同?

根据this article^,我需要显式调用ConfigureAwait来更改延续上下文的行为!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-17 21:14:15

当您使用await时,默认情况下,await运算符将捕获当前的“上下文”,并使用该上下文恢复async方法。

这个“上下文”是SynchronizationContext.Current,除非它是null,在这种情况下,它是TaskScheduler.Current。(如果没有当前正在运行的任务,则TaskScheduler.Current与线程池任务调度程序TaskScheduler.Default相同)。

需要注意的是,SynchronizationContextTaskScheduler并不一定意味着特定的线程。UI SynchronizationContext会将工作安排到UI线程;但是ASP.NET SynchronizationContext不会将工作安排到特定的线程。

我怀疑造成问题的原因是您调用async代码太早。当应用程序启动时,它只有一个普通的常规线程。该线程只有在执行类似Application.Run的操作时才会成为UI线程。

票数 41
EN

Stack Overflow用户

发布于 2014-02-17 20:29:51

await表达式将使用SynchronizationContext.Current值将控制流返回到其发生的线程。在这是null的情况下,它将默认为TaskScheduler.Current。当Task值完成时,实现仅依赖于此值来更改线程上下文。在本例中,await捕获的上下文没有绑定到UI线程

票数 6
EN

Stack Overflow用户

发布于 2020-12-30 08:11:19

默认情况下,Windows窗体在创建第一个控件时设置同步上下文。

所以你可以这样做:

代码语言:javascript
复制
[STAThread]
static void Main()
{
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    var f = new Form1();
    //var s=SynchronizationContext.Current;
    //var s2=TaskScheduler.Current;
    GetAsync();
    Application.Run(f);
}

static async Task<bool> GetAsync()
{
    MessageBox.Show($"thread id {Thread.CurrentThread.ManagedThreadId}");
    bool flag = await Task.Factory.StartNew<bool>(() =>
    {
       Thread.Sleep(1000);
       return true;
    });
    MessageBox.Show($"thread id {Thread.CurrentThread.ManagedThreadId}");
    return flag;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21838651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档