【发布时间】:2020-01-27 09:45:46
【问题描述】:
我正在处理一些遗留代码,这些代码在新线程中重复调用长时间运行的任务:
var jobList = spGetSomeJobIds.ToList();
jobList.ForEach((jobId) =>
{
var myTask = Task.Factory.StartNew(() => CallExpensiveStoredProc(jobId),
TaskCreationOptions.LongRunning);
myTask.Wait();
});
由于调用线程立即调用Wait 并阻塞直到任务完成,我在Task.Factory.StartNew 代码中看不到任何点。我错过了什么吗? TaskCreationOptions.LongRunning 有什么可以增加价值的东西吗?
【问题讨论】:
-
如果它执行异步
await而不是Wait那么在某些上下文(释放 UI 线程)中它是有意义的。但是做一个阻塞等待,我不会这么想的。 -
这将是一种确保
CallExpensiveStoredProc在单独的线程上运行并且不会同时发生两次CallExpensiveStoredProc调用的方法。 -
@Enigmativity 我应该添加这是一个控制台应用程序,并且只有一个实例会运行,考虑到该约束,您在
Task.Factory.StartNew代码中看到任何值吗? -
@jonaglon - 如果您关闭应用程序,后台线程也将干净地退出。这可能与此有关。
-
我认为没有任何意义。
标签: c# multithreading task