0

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

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

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

4

1 回答 1

1

您绝对不必使用 Process.Start。

我还没有找到任何保证使用TaskCreationOptions.LongRunning总是在独立于 ThreadPool 的新线程上触发任务,但含义是这样的。我能找到的最好的是:

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

但接着说:

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

提示还是保证?我相当确定这是有保证的,但这只是一种意见,IMO 的文档并没有明确支持这一点。

使用反编译器进行少量工作就会告诉您真相。

如果你还是不开心,那么:

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

绝对保证长时间运行的工作不会饿死你的线程池。只要确保你不会用十亿个线程杀死你的 CPU。

于 2013-09-08T01:01:35.287 回答