我创建了一个HttpListener
的Web服务。对于某些请求,它需要长时间运行的作业,这可能需要大约10分钟。所以我关注并从服务器返回:
var task = Task.Factory.StartNew(() => ImportDocuments(), TaskCreationOptions.LongRunning);
CreateResponse(context.Response, "started");
这是否可以保证从服务器返回并启动新线程来完成任务,或者我必须使用Process.Start
?我没有使用Process.Start
,而是使用单独的应用程序而不是Windows应用程序。
答案 0 :(得分:1)
您绝对不必使用Process.Start。
我还没有找到任何保证,使用TaskCreationOptions.LongRunning
总是在独立于ThreadPool的新线程上触发任务,但暗示是这样的。 best I can find就是它:
向调度程序提供一个提示,指出该任务可能需要一个额外的线程,这样它就不会阻止本地队列上其他线程或工作项的前进。
但接着陈述:
通过使用此选项,您可以完全避免使用ThreadPool,包括全局和本地队列。
提示还是保证?我很确定这是有保证的,但这只是一个意见和IMO,文档并没有断然支持这一点。
使用反编译器的少量工作会告诉你真相。
如果你仍然不开心,那么:
new Thread(() => {
//my long running code
}).Start();
绝对可以保证长时间运行的工作不会使你的ThreadPool挨饿。只要确保你没有使用十亿个线程杀死你的CPU。