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

本文关键字:任务 创建 异步方法 运行 同步 长时间 | 更新日期: 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.StartnewTaskCreationOptions.LongRunning一起使用是向TaskScheduler发出信号,我们将需要一个新的专用线程来完成工作,这样我们就不会导致ThreadPool 饥饿

在这种情况下,DoSomeLongRunningTask返回一个Task,因为返回类型是void,这将在将来方法完成时完成。

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

下面是一个例子,以防您下次想要实现进度,并且您确实可以控制异步方法。