Task.StartNew()在STA模式下的工作方式不同
本文关键字:工作 方式不 模式 STA StartNew Task | 更新日期: 2023-09-27 17:50:22
我对整个线程的事情很陌生,所以希望有人能给我一些启发。
我有一个WPF UI,我从点击按钮开始一个DLL。当按钮被点击时,它异步运行dll,以便用户仍然可以在dll执行其工作时"导航"UI:
await Task.Factory.StartNew(new Action(() => strTime =
StartSync.Start(strPathFile,
licManager.idCmsMediator)));
这个工作得很好,直到我不得不在STA模式下运行这个任务来打开dll中的窗口。所以我用这篇文章中描述的方法改变了这一行:
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
await Task.Factory.StartNew(new Action(() => strTime =
StartSync.Start(strPathFile,
licManager.idCmsMediator)),
System.Threading.CancellationToken.None,
TaskCreationOptions.None, scheduler);
但是现在当我通过点击按钮运行dll时,我无法再导航UI了!就像它不再异步运行一样!?如何在STA模式下启动任务,但仍然能够导航UI ?
Thanks in advance
但是现在当我通过点击按钮运行dll时,我无法导航UI
Task != Thread
。一个任务可能会也可能不会使用线程来完成它的工作。当你使用:
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
你告诉任务工厂在当前捕获的同步上下文上执行给定的委托,这是你的UI同步上下文。当你这样做的时候,它会在UI消息循环上执行这个。
这个工作得很好,直到我不得不在STA模式下运行这个任务才能打开Windows中的dll
打开一个窗口应该在UI线程上完成,这就是为什么它会抱怨。你能做的就是在后台线程中延迟CPU绑定工作的执行,一旦你需要操作UI,就把工作封送回去:
// Start CPU bound work on a background thread
await Task.Run(() => strTime = StartSync.DoCpuWork(strPathFile,
licManager.idCmsMediator)));
// We're done awaiting, back onto the UI thread, Update window.