gpt4 book ai didi

c# - 无论如何在 UI 线程上调用 Task.Factory.StartNew

转载 作者:行者123 更新时间:2023-11-30 17:04:17 28 4
gpt4 key购买 nike

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

想法?

谢谢克里斯托夫

编辑:

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

最佳答案

谢谢大家的指点,

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

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

特别感谢 Viv 分享链接。这对了解正在发生的事情有很大帮助。

克里斯托夫

关于c# - 无论如何在 UI 线程上调用 Task.Factory.StartNew,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17702226/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com