【问题标题】:HTTPListener and LongRunning jobsHTTPListener 和 LongRunning 作业
【发布时间】:2013-09-11 19:46:57
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您绝对不必使用 Process.Start。

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

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

    但接着说:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2016-12-29
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多