也许这是重复的,但我没有看到任何类似的东西,或者没有用Google搜索过这么多......我对异步模式很新...
想象一下,您有一个长时间运行(和线程阻塞)处理任务,绑定到您没有代码访问权限的DLL。喜欢这个:
void DoSomeLongRunningTask(out int taskProgress);
我需要在ASP.NET MVC 4控制器上的异步方法中使用它。 taskProgress out参数将提供类似进度条的组件。
如何将该同步方法包含在异步方法中? 你能指点一下如何实现这个目标吗?
提前谢谢。
答案 0 :(得分:1)
如果需要异步调度长时间运行的同步任务,并且您无法访问DLL调度该方法以使其真正异步,则可以使用Task.Run
或在此情况下使用Task.Factory.Startnew
将它部署在ThreadPool线程上。
var myTask = await Task.Factory.StartNew(() => DoSomeLongRunningTask(out taskProgress), TaskCreationOptions.LongRunning);
将Task.Factory.Startnew
与TaskCreationOptions.LongRunning
一起使用,即表示TaskScheduler
我们需要一个新的专用线程来完成工作,因此我们不会导致饥饿到ThreadPool
DoSomeLongRunningTask
会返回Task
,因为返回类型为void
,将来会在方法完成时完成。
如果您有权访问该方法,我建议您查看IProgress<T>
,其中公开了一个简单的Progress方法,您可以更新UI。
Here is an example如果您想在下次实施进度,并且您可以控制异步方法。