我对这整个线程都很陌生,所以希望有人可以启发我。
我有一个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中导航?
提前致谢
答案 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.