更新现在已经不是问题了。没有意识到theadID返回的内部和外部的Dispatcher.Invoke方法是不同的。
据我理解,在使用异步时,等待任务T1将在一个不同的线程中执行,并且等待后面的代码被包装为带有ContinueWith of T1的任务T2。因此,我假设threadcontextID在下面的代码中是不同的。但是,下面的代码生成相同的ThreadContextID。我的理解错了吗?
另外,为什么我必须在T1中使用Dispatcher,但是可以直接更新T2中的主UI?threadContext开关是如何在异步/等待中工作的?谢谢。
更新: T1中的代码正在VS Debug视图的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>发布于 2014-06-20 10:23:46
等待之后,流将被安排在调用线程上,这就是为什么您不需要T2中的调用。如果您想在t1的线程上继续,那么使用.ConfigureAwait(continueOnCapturedContext: false)。
https://stackoverflow.com/questions/24324575
复制相似问题