使用同步长时间运行的任务创建异步方法

时间:2014-04-29 17:53:32

标签: c# asp.net-mvc asynchronous task

也许这是重复的,但我没有看到任何类似的东西,或者没有用Google搜索过这么多......我对异步模式很新...

想象一下,您有一个长时间运行(和线程阻塞)处理任务,绑定到您没有代码访问权限的DLL。喜欢这个:

void DoSomeLongRunningTask(out int taskProgress);

我需要在ASP.NET MVC 4控制器上的异步方法中使用它。 taskProgress out参数将提供类似进度条的组件。

如何将该同步方法包含在异步方法中? 你能指点一下如何实现这个目标吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果需要异步调度长时间运行的同步任务,并且您无法访问DLL调度该方法以使其真正异步,则可以使用Task.Run或在此情况下使用Task.Factory.Startnew将它部署在ThreadPool线程上。

var myTask = await Task.Factory.StartNew(() => DoSomeLongRunningTask(out taskProgress), TaskCreationOptions.LongRunning);

Task.Factory.StartnewTaskCreationOptions.LongRunning一起使用,即表示TaskScheduler我们需要一个新的专用线程来完成工作,因此我们不会导致饥饿到ThreadPool

在这种情况下,

DoSomeLongRunningTask会返回Task,因为返回类型为void,将来会在方法完成时完成。

如果您有权访问该方法,我建议您查看IProgress<T>,其中公开了一个简单的Progress方法,您可以更新UI。

Here is an example如果您想在下次实施进度,并且您可以控制异步方法。