使用同步长时间运行的任务创建异步方法
本文关键字:任务 创建 异步方法 运行 同步 长时间 | 更新日期: 2023-09-27 18:00:42
也许这是重复的,但我还没有看到类似的东西,或者没有在谷歌上搜索太多。。。我对异步模式很陌生。。。
想象一下,您有一个长时间运行(和线程阻塞)的处理任务,绑定到一个没有代码访问权限的DLL。像这个:
void DoSomeLongRunningTask(out int taskProgress);
我需要在ASP.NET MVC 4控制器上的异步方法中使用它。taskProgress out参数将提供类似进度条的组件。
如何将同步方法封装在异步方法上?你能为我指明一些如何实现这一目标的方向吗?
提前谢谢。
如果您需要异步调度一个长时间运行的同步任务,并且您无法访问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。
下面是一个例子,以防您下次想要实现进度,并且您确实可以控制异步方法。