C# 创建新任务会生成后台线程还是线程池线程
我正在尝试对ASP.NET应用程序进行异步数据库调用。如果我理解正确,我不想利用线程池线程进行异步I/O调用,这样我就可以保持线程池处理请求。下面的代码是从我的线程池中提取一个线程还是生成一个后台线程C# 创建新任务会生成后台线程还是线程池线程,c#,asp.net,multithreading,async-await,C#,Asp.net,Multithreading,Async Await,我正在尝试对ASP.NET应用程序进行异步数据库调用。如果我理解正确,我不想利用线程池线程进行异步I/O调用,这样我就可以保持线程池处理请求。下面的代码是从我的线程池中提取一个线程还是生成一个后台线程 public IEnumerable<dynamic> DbCall(string sql) { return // DB Operation; } public Task<IEnumerable<dynamic>&g
public IEnumerable<dynamic> DbCall(string sql)
{
return // DB Operation;
}
public Task<IEnumerable<dynamic>> DbCallAsync(string sql)
{
var task = new Task<IEnumerable<dynamic>>(() => this.DbCall(sql));
task.Start();
return task;
}
公共IEnumerable数据库调用(字符串sql)
{
返回//DB操作;
}
公共任务DbCallAsync(字符串sql)
{
var task=newtask(()=>this.DbCall(sql));
task.Start();
返回任务;
}
默认计划程序上的任务在线程池上运行。默认情况下,它们不会启动新线程。这回答了你的问题 也就是说,您误解了异步IO的目的和内部工作方式。异步IO在运行时根本不消耗任何线程。但是,您没有使用异步IO。您正在将IO移动到线程池。这在ASP.NET中永远不会有帮助。它总是降低性能 将阻塞工作移动到另一个线程怎么可能有帮助?!您仍在阻塞线程。只是一个不同的。如果线程池已耗尽,请增加限制。不需要手动启动线程
研究异步为何有益以及何时有益。如果没有这种理解,您将无法成功地使用它。是的,使用
任务
构造函数在另一个线程中执行代码,在本例中是线程池线程
您应该使用本质上是异步的而不是同步的DB操作。您根本不应该使用
任务
构造函数来构造表示异步操作的任务
。如何进行这项工作将取决于您用于执行IO的API。我澄清了一点。。。不管怎么说,这就是XY问题。嗯,我想我当时不明白。我的印象是,它会将处理I/O操作的当前线程释放回线程池,直到I/O操作完成为止。@DaleAlleshouse它会这样做。但是IO操作现在在不同的线程上同步运行。这样做没有任何好处。我使用的是simple.data,它不支持异步。我想知道如何将其称为异步。问题是我需要并行运行5条sql语句。我不想成为阻止6个线程池线程来完成这项任务。@DaleAlleshouse然后开始使用一种查询机制,该机制具有异步支持,允许您在不阻止线程的情况下执行查询。如果你不这样做,你就别无选择。