Async ThreadContext ID

本文关键字:ID ThreadContext Async | 更新日期: 2023-09-27 18:09:27

UPDATE现在没有问题了。没有意识到在Dispatcher内部和外部都返回了theadID。

根据我的理解,当使用async时,等待任务T1将在不同的线程中执行,await后面的代码被包装为任务T2,具有T1的ContinueWith。所以我假设threadcontextID在下面的代码中是不同的。然而,下面的代码生成相同的ThreadContextID。我的理解错了吗?

另外,为什么我必须在T1中使用Dispatcher,但可以直接在T2中更新主UI ?threadContext开关如何在async/await中工作?谢谢。

UPDATE: T1中的代码在VS调试线程视图的主线程中执行。然而,如果它是在主线程,为什么我不能直接更新UI ?它给了我一个CrossThread异常。

async private void AsyncTask(object sender, RoutedEventArgs e)
    {
        OutputDialog.Text = Thread.CurrentThread.ManagedThreadId+ Environment.NewLine + OutputDialog.Text;
        Task T1 = new Task(
                    () => {
                            Thread.Sleep(5000);
                            OutputDialog.Dispatcher.Invoke(() => { 
                                OutputDialog.Text = "Task in AWAIT" + Environment.NewLine + OutputDialog.Text;
                                OutputDialog.Text = Thread.CurrentThread.ManagedThreadId + Environment.NewLine + OutputDialog.Text;
                            });
                    });
        T1.Start();
        await T1;
        //T2
        OutputDialog.Dispatcher.Invoke(() => { OutputDialog.Text = "Continued Task after AWAIT 1" + Environment.NewLine + OutputDialog.Text; });
        OutputDialog.Text = "Continued Task after AWAIT 2" + Environment.NewLine + OutputDialog.Text;
        OutputDialog.Text = Thread.CurrentThread.ManagedThreadId + Environment.NewLine + OutputDialog.Text;
    }
UI的xaml代码
<Grid>
    <StackPanel>
        <Button Click="AsyncTask">Execute now</Button>
        <TextBox Name="OutputDialog" Background="Gray" Foreground="Yellow" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" VerticalContentAlignment="Stretch">
        </TextBox>
    </StackPanel>
</Grid>

Async ThreadContext ID

在await之后,流被调度到调用线程上,所以这就是为什么在T2中不需要Invoke。如果你想继续T1的线程,然后使用.ConfigureAwait(continueOnCapturedContext: false)