我试图为ASP.NET应用程序调用异步数据库。如果我理解正确,我不想利用线程池线程进行异步I / O调用,这样我就可以保持线程池处理请求。下面的代码会从我的线程池中剔除一个线程还是生成一个后台线程?
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;
}
答案 0 :(得分:5)
是的,使用Task
构造函数执行另一个线程中的代码,在本例中是一个线程池线程。
您应该使用本质上异步,而不是同步的数据库操作。您根本不应该使用Task
构造函数来构造表示异步操作的Task
。如何执行此操作取决于您用于执行IO的API。
答案 1 :(得分:2)
默认调度程序上的任务在线程池上运行。默认情况下,它们不会启动新线程。这回答了你的问题。
那就是说,你误解了异步IO的目的和内部工作原理。 Async IO在运行时根本不消耗任何线程。但是,您没有使用异步IO。您正在将IO移动到线程池。这从来没有帮助ASP.NET。它总是会降低性能。
将阻塞工作移到另一个线程怎么可能有帮助?!你还在阻止一个线程。只是一个不同的。如果你的线程池耗尽,只需增加限制。无需手动启动线程。
研究为什么异步是有益的,何时。如果没有这种理解,你就不会成功使用它。