3

至少从我的角度来看,我必须处理一个奇怪的问题。我使用任务等到变量获得特定值,然后再次在 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());

想法?

谢谢克里斯托夫

编辑:

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

4

1 回答 1

2

谢谢大家的指点,

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

这里的情况是我(间接地)在任务调度器描述的调度程序中使用了 StartNew()。因此,默认调度程序是包含 ui 线程的调度程序——> 在 ui 线程上调用了新任务。

特别感谢 Viv 分享链接。这有助于了解发生了什么。

克里斯托夫

于 2013-07-17T16:17:18.290 回答