【发布时间】:2013-07-18 00:17:18
【问题描述】:
至少从我的角度来看,我必须处理一个奇怪的问题。我使用一个任务等到一个变量得到一个特定的值,然后再次在 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());
想法?
感谢克里斯托夫
编辑:
对我来说最有趣的是为什么会发生这种情况而不是如何解决这个问题。 我想了解那里发生了什么......
【问题讨论】:
-
是的,但我不想在每次关闭窗口时都引发操作。我只是想确保在我打开一个新的时它已关闭。此外,对我来说如何解决这个问题更有趣的是要了解为什么两者都在同一个线程上执行。对不起,如果这不是我的问题。
-
我已经整理了一个示例应用程序,它对我来说运行良好,但是,当您查询托管 ID 时,您是否将它放入了一个带有闭包的变量中?我的 UI 线程 ID 为 9,我的内部线程 ID(来自
ThreadPool)为 10。 -
Task.Factory.StartNew不保证会生成新的线程检查 This answer 以获取一些详细信息以及其中的前 2 个 cmets。您也可以尝试将TaskCreationOptions.LongRunning指定为该链接答案提及的第四条评论,以强制为任务生成一个新线程 -
@Viv 如果没有提供,它不使用默认的
TaskScheduler吗?对我来说这是ThreadPool(根据我的调试器)。 -
检查
TaskScheduler.FromCurrentSynchronizationContext()在运行时返回的内容。如果您已经在线程池中,则 threadid 可能保持不变。
标签: c# wpf multithreading task