我有一个过程需要异步在另一个线程上执行。该过程将批量处理大量数据(可以接收2个项目或40000个数据)。从本地测试来看,最长的运行时间约为2分钟(用于40000个项目)。
场景如下:后端的UI调用,后端启动一个异步线程,该线程将运行该过程,然后返回一个布尔值,以了解是否已接收到请求(这些是要求,我不要使用await / wait)。在以下之间,我不确定在这里使用什么
Task.Run(()=> MyProcedure())
OR
Task.Factory.StartNew(()=> MyProcedure(), TaskCreationOptions.LongRunning)
在这种情况下最好的选择是什么?
答案 0 :(得分:1)
该过程将分批处理大量数据
这可能意味着多件事。如果您打算在这些批次中使用await
/ MyProcedure
,以使Task.Run
实际上是异步的,那么使用{{1} }; MyProcedure
会在异步后立即释放回线程池,这意味着它应该可以正常工作,例如:
async Task MyProcedure() { while (ThereIsWorkToDo) { var batch = // ... gather some work await ProcessBatchAsync(batch).ConfigureAwait(false); } }
但是:如果MyProcedure()
不是异步的,但是您只想在后台运行它,那么,TaskCreationOptions.LongRunning
可能是合理的,但是对于某些情况2分钟:可能是常规的专用线程。