创建新任务是否会生成后台线程或线程池线程

时间:2014-07-11 13:58:08

标签: c# asp.net multithreading async-await

我试图为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;
    }

2 个答案:

答案 0 :(得分:5)

是的,使用Task构造函数执行另一个线程中的代码,在本例中是一个线程池线程。

您应该使用本质上异步,而不是同步的数据库操作。您根本不应该使用Task构造函数来构造表示异步操作的Task。如何执行此操作取决于您用于执行IO的API。

答案 1 :(得分:2)

默认调度程序上的任务在线程池上运行。默认情况下,它们不会启动新线程。这回答了你的问题。

那就是说,你误解了异步IO的目的和内部工作原理。 Async IO在运行时根本不消耗任何线程。但是,您没有使用异步IO。您正在将IO移动到线程池。这从来没有帮助ASP.NET。它总是会降低性能。

将阻塞工作移到另一个线程怎么可能有帮助?!你还在阻止一个线程。只是一个不同的。如果你的线程池耗尽,只需增加限制。无需手动启动线程。

研究为什么异步是有益的,何时。如果没有这种理解,你就不会成功使用它。