HTTPListener和LongRunning作业

时间:2013-09-08 00:44:27

标签: c# asp.net thread-safety httplistener

我创建了一个HttpListener的Web服务。对于某些请求,它需要长时间运行的作业,这可能需要大约10分钟。所以我关注并从服务器返回:

var task = Task.Factory.StartNew(() => ImportDocuments(), TaskCreationOptions.LongRunning);
CreateResponse(context.Response, "started");

这是否可以保证从服务器返回并启动新线程来完成任务,或者我必须使用Process.Start?我没有使用Process.Start,而是使用单独的应用程序而不是Windows应用程序。

1 个答案:

答案 0 :(得分:1)

您绝对不必使用Process.Start。

我还没有找到任何保证,使用TaskCreationOptions.LongRunning总是在独立于ThreadPool的新线程上触发任务,但暗示是这样的。 best I can find就是它:

  

向调度程序提供一个提示,指出该任务可能需要一个额外的线程,这样它就不会阻止本地队列上其他线程或工作项的前进。

但接着陈述:

  

通过使用此选项,您可以完全避免使用ThreadPool,包括全局和本地队列。

提示还是保证?我很确定这是有保证的,但这只是一个意见和IMO,文档并没有断然支持这一点。

使用反编译器的少量工作会告诉你真相。

如果你仍然不开心,那么:

new Thread(() => {
    //my long running code
}).Start();

绝对可以保证长时间运行的工作不会使你的ThreadPool挨饿。只要确保你没有使用十亿个线程杀死你的CPU。