更新现在不是问题。没有意识到在Dispatcher.Invoke方法内外返回的theadID是不同的。
根据我的理解,当使用异步时,等待任务T1将在不同的线程中执行,并且await之后的代码被包装为具有ContinueWith为T1的任务T2。所以我假设threadcontextID在下面的代码中会有所不同。但是,下面的代码生成相同的ThreadContextID。我的理解错了吗?
另外,为什么我必须在T1中使用Dispatcher,但是可以直接在T2中更新主UI? threadContext开关如何在async / await中工作?感谢。
UPDATE: T1中的代码在VS Debug Thread视图的MainThread中执行。但是,如果它在主线程中,为什么我不能直接更新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>
答案 0 :(得分:0)
等待之后,将在调用线程上调度流,这就是为什么在T2中不需要Invoke的原因。如果您想继续使用T1的话题,请使用.ConfigureAwait(continueOnCapturedContext: false)