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

Task.StartNew()在STA模式下的工作方式不同

但是现在当我通过点击按钮运行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.