Task.Run一个引发事件的方法

时间:2014-06-07 18:41:27

标签: c# wpf asynchronous task

在用WPF和C#编写的Windows应用商店应用程序中,我需要启动一个从文件中收集信息的异步​​方法。但我希望它在后台运行,而UI则响应用户交互。所以,我这样做了:

Task x = Task.Run(async () => await Method());

问题是,“方法”必须向UI提出更改通知。正如您所料,它崩溃了,因为引发事件的方法不在UI线程中。

所以,我这样做了:

TaskScheduler t = TaskScheduler.FromCurrentSynchronisationContext();
Task x = Task.Run(() => {}).ContinueWith(async _ => await Method(), t);

我的问题是,因为我必须指定一个同步上下文,并且由于无法在Run方法中指定它,有没有办法做这样的事情:

TaskScheduler t = TaskScheduler.FromCurrentSynchronisationContext();
Task x = Task.ContinueWith(async _ => await Method(), t);

或者,如果您有其他建议可以使其发挥作用,欢迎使用。

谢谢。

1 个答案:

答案 0 :(得分:2)

您根本不需要启动新的Task。你可以简单地await Method()而不需要在使用ThreadPool thrrad的ContinueWith上使用Task。当你await使用异步方法时,它会同步运行直到第一次await并返回调用方法,这将使您的UI保持响应

你可以简单地

await Method();
相关问题