Pra*_*tic 8 c# multithreading asynchronous async-await
我对async/await的了解是,当任务完成时,继续在调用await时在相同的上下文中运行,在我的例子中,这将是UI线程.但我的问题是,在IO完成之后和移动到同一个UI线程之前,它是否在内部创建了一个新线程.
我正在分享一段代码.如果我单击此按钮一次,它会在执行await之前显示可用线程为1023,但在此之后,可用线程将下降到1022.虽然当我检查线程ID时,它与UI线程相同.
    private async void button1_ClickAsync(object sender, EventArgs e)
    {
        int x, y;
        ThreadPool.GetAvailableThreads(out x, out y);
        textBox1.Text = x.ToString()+"..."+y.ToString();
        await Task.Delay(5000);
        ThreadPool.GetAvailableThreads(out x, out y);
        textBox1.Text = x.ToString() + "..." + y.ToString();
    }
但有趣的是,下次单击此按钮时,可用线程数仍为1023(等待之前和之后).
但是我的问题是,它会在IO完成之后并移至相同的UI线程之前(内部)创建一个新线程。
可能会暂时使用其他线程,但是您不必为此担心。
特别是,.NET上的I / O通常通过作为线程池一部分的I / O完成端口。I / O线程会根据需要自动添加和删除。通常,在I / O实际准备好返回到代码之前(例如,解析HTTP响应标头),还有一些其他工作要做,因此许多 BCL I / O代码实际上将使用I / O线程只是将工作排队到线程池中。因此,I / O代码经常(简短地)使用线程池工作线程。
另外,在这个特定的示例中,我相信还有一个单独的计时器线程可以合并系统计时器。自然,这是一个实现细节,并且随时可能更改。
因此,总而言之,可能会创建/销毁/临时使用其他线程,但是您不必为此担心。它们全部由BCL或.NET运行时以非常有效的方式进行管理,从而在重用线程(最小化搅动)和最小化资源使用(尤其是内存)之间取得平衡。
| 归档时间: | 
 | 
| 查看次数: | 618 次 | 
| 最近记录: |