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

时间:2015-05-21 07:49:01

标签: c# wpf multithreading async-await task-parallel-library

我对这整个线程都很陌生,所以希望有人可以启发我。

我有一个WPF UI,只需点击一下按钮即可从中启动DLL。单击该按钮时,它会异步运行dll,以便用户仍然可以导航" dll正在执行其工作时的UI:

await Task.Factory.StartNew(new Action(() => strTime = 
                                             StartSync.Start(strPathFile,
                                             licManager.idCmsMediator)));

这非常有效,直到我必须在STA模式下运行此任务才能打开dll中的窗口。所以我使用this post中描述的方法改变了这一行:

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中导航?

提前致谢

1 个答案:

答案 0 :(得分:3)

  

但现在当我通过点击按钮运行dll时,我无法导航   用户界面

Task != Thread。任务可能会也可能不会使用线程来完成它的工作。 当你使用:

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

您告诉任务工厂在当前捕获的同步上下文(即您的UI同步上下文)上执行给定的委托。当你这样做时,它将在UI消息循环上执行它。

  

这非常有效,直到我必须在STA模式下运行此任务才能打开   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.