C# 背景线程是个坏主意吗?为什么?
所以我被告知我在这里做的是错误的,但我不知道为什么 我有一个网页,可以导入带有文档编号的CSV文件,以便对其执行昂贵的操作。我已经将昂贵的操作放入后台线程,以防止它阻塞应用程序。简而言之,这就是我所拥有的C# 背景线程是个坏主意吗?为什么?,c#,multithreading,background,C#,Multithreading,Background,所以我被告知我在这里做的是错误的,但我不知道为什么 我有一个网页,可以导入带有文档编号的CSV文件,以便对其执行昂贵的操作。我已经将昂贵的操作放入后台线程,以防止它阻塞应用程序。简而言之,这就是我所拥有的 protected void ButtonUpload_Click(object sender, EventArgs e) { if (FileUploadCSV.HasFile) { string fileText; using (var sr
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
使用线程池
线程,这不应该用于长期运行的操作。您对此有参考吗?这还取决于“长时间运行”。在“足够长的时间,我们不想让用户坐等”和“数小时或数天”之间有区别。这些操作可能需要几分钟,但可能需要两个小时以上。请参阅本文末尾,了解为什么要使用专用线程而不是池线程来执行长时间运行的任务: