无论如何,在UI线程上调用Task.Factory.StartNew

时间:2013-07-17 14:15:34

标签: c# wpf multithreading task

至少从我的观点来看,我必须处理一个奇怪的问题。我使用一个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

编辑:

对我来说最有趣的是为什么这不是如何解决这个问题。 我想了解那里发生的事情......

1 个答案:

答案 0 :(得分:2)

谢谢大家的提示,

我终于认为我明白了。这里的问题是TaskScheduler.Current是调用StartNew()时使用的默认调度程序。当使用TaskScheduler.SynchronizationContext()时,这不是一个好的组合。

这里的情况是我(间接)在使用TaskScheduler.SynchronizationContext()描述的调度程序的持续任务中使用StartNew()。因此默认调度程序是包含ui线程的调度程序 - >在ui线程上调用了新的任务。

特别感谢Viv,分享链接。它帮助了解了发生了什么。

了Christoph