C# 背景线程是个坏主意吗?为什么?

C# 背景线程是个坏主意吗?为什么?,c#,multithreading,background,C#,Multithreading,Background,所以我被告知我在这里做的是错误的,但我不知道为什么 我有一个网页,可以导入带有文档编号的CSV文件,以便对其执行昂贵的操作。我已经将昂贵的操作放入后台线程,以防止它阻塞应用程序。简而言之,这就是我所拥有的 protected void ButtonUpload_Click(object sender, EventArgs e) { if (FileUploadCSV.HasFile) { string fileText; using (var sr

所以我被告知我在这里做的是错误的,但我不知道为什么

我有一个网页,可以导入带有文档编号的CSV文件,以便对其执行昂贵的操作。我已经将昂贵的操作放入后台线程,以防止它阻塞应用程序。简而言之,这就是我所拥有的

protected void ButtonUpload_Click(object sender, EventArgs e)
{
    if (FileUploadCSV.HasFile)
    {
        string fileText;
        using (var sr = new StreamReader(FileUploadCSV.FileContent))
        {
            fileText = sr.ReadToEnd();
        }

        var documentNumbers = fileText.Split(new[] {',', '\n', '\r'}, StringSplitOptions.RemoveEmptyEntries);

        ThreadStart threadStart = () => AnotherClass.ExpensiveOperation(documentNumbers);
        var thread = new Thread(threadStart) {IsBackground = true};
        thread.Start();
    }
}
(显然有一些错误检查和用户信息)

所以我的三个问题是:

  • a) 这是个坏主意吗
  • b) 为什么这是个坏主意
  • c) 你会怎么做
  • 是的


    使用线程池;)将工作项排队-避免生成大量线程的开销。

    我建议您使用该类,而不是直接使用线程。这是因为BackgroundWorker专门为图形应用程序执行后台操作而设计,并且(除其他外)提供了向用户界面传达更新的机制。

    一个可能的问题是,您的后台线程正在网站应用程序池中运行。IIS可能会决定回收您的应用程序池,导致昂贵的操作在完成之前被终止

    我宁愿选择一个单独的进程,可能是一个windows服务,它将获取昂贵的操作请求,并在asp.net进程之外执行它们。这不仅意味着您昂贵的操作将在应用程序池重新启动后生存,而且还将简化您的web应用程序,因为它不必处理处理过程

    告诉服务执行昂贵的进程可以使用某种进程间通信来完成,服务可以轮询数据库表或文件,或者您可以使用服务将侦听的管理队列


    有很多方法可以做到这一点,但我的主要观点是,如果可能的话,您应该将昂贵的进程从web应用程序中分离出来。

    但是
    BackgroundWorker
    使用
    线程池
    线程,这不应该用于长期运行的操作。您对此有参考吗?这还取决于“长时间运行”。在“足够长的时间,我们不想让用户坐等”和“数小时或数天”之间有区别。这些操作可能需要几分钟,但可能需要两个小时以上。请参阅本文末尾,了解为什么要使用专用线程而不是池线程来执行长时间运行的任务: