以下代码是真实应用程序中一个代码的简化版本。下面的问题是,一个长时间的工作将在UI线程中运行,而不是在后台线程中运行。
void Do()
{
Debug.Assert(this.Dispatcher.CheckAccess() == true);
Task.Factory.StartNew(ShortUIWork, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
void ShortUIWork()
{
Debug.Assert(this.Dispatcher.CheckAccess() == true);
Task.Factory.StartNew(LongWork, TaskCreationOptions.LongRunning);
}
void LongWork()
{
Debug.Assert(this.Dispatcher.CheckAccess() == false);
Thread.Sleep(1000);
}
通常情况下,Do()方法是从UI上下文中调用的。ShortUIWork也是如此,因为它在TaskScheduler中被定义。然而,LongWork最终也会在UI线程中被调用,这当然会阻塞UI。
如何确保任务不在UI线程中运行?
tasks
创建的线程根据定义 不会 在 UI 上运行。您确定LongWork
阻塞了 UI 线程吗? - Tigran