Mar*_*cin 0 c# wpf task task-parallel-library
在这篇文章中,Stephen 描述了在外部 StartNew(参见下面的代码片段)中,TaskScheduler.Current 是我们的 UI 任务调度程序。事实上,下面代码的输出似乎表明所有内容都是在 UI 线程上执行的。然而,当我尝试确认这一点时,我得到了不同的答案:
private void Button_Click(object sender, RoutedEventArgs e)
{
var uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
var ui = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
ui.StartNew(() =>
{
Debug.WriteLine("TaskScheduler.Current == UI TaskScheduler: " + (uiTaskScheduler == TaskScheduler.Current));
Debug.WriteLine("UI on thread " + Environment.CurrentManagedThreadId);
Task.Factory.StartNew(() =>
{
Debug.WriteLine("Background work on thread " + Environment.CurrentManagedThreadId);
});
});
}
Run Code Online (Sandbox Code Playgroud)
和输出:
TaskScheduler.Current == UI TaskScheduler: False
UI on thread 1
Background work on thread 1
Run Code Online (Sandbox Code Playgroud)
为什么会uiTaskScheduler == TaskScheduler.Current返回 false?
为什么会
uiTaskScheduler == TaskScheduler.Current返回 false?
该方法TaskScheduler.FromCurrentSynchronizationContext()创建一个新的 TaskScheduler 实例。由于您调用它两次,您会得到两个实例 - 尽管它们与相同的 SynchronizationContext 关联,但它们并不相等。
将您的代码更改为:
var uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
var ui = new TaskFactory(uiTaskScheduler);
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |