至少从我的观点来看,我必须处理一个奇怪的问题。我使用一个Task来等待一个变量得到一个特定的值,然后再次在ui线程上运行Continue部分。
现在的问题是,在我调用StartNew()之前,在调用内部,ManagedThreadId是相同的,它会冻结我的UI。
这是我的代码:
// ManagedThreadId here
Task.Factory.StartNew(() =>
{
// and here are the same.
while (isClosing)
{
Thread.Sleep(50);
}
}).ContinueWith((finishedTask) =>
{
if (currentContainer != null)
{
window = currentContainer;
}
else
{
window = CreateBallonWindow();
window.Show();
}
window.Activate();
}, TaskScheduler.FromCurrentSynchronizationContext());
想法?
感谢Christoph
编辑:
对我来说最有趣的是为什么这不是如何解决这个问题。 我想了解那里发生的事情......
答案 0 :(得分:2)
谢谢大家的提示,
我终于认为我明白了。这里的问题是TaskScheduler.Current是调用StartNew()时使用的默认调度程序。当使用TaskScheduler.SynchronizationContext()时,这不是一个好的组合。
这里的情况是我(间接)在使用TaskScheduler.SynchronizationContext()描述的调度程序的持续任务中使用StartNew()。因此默认调度程序是包含ui线程的调度程序 - >在ui线程上调用了新的任务。
特别感谢Viv,分享链接。它帮助了解了发生了什么。
了Christoph