为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免异步方法使用新线程?

如何避免异步方法使用新线程?

C#
哈士奇WWW 2021-06-04 14:05:48
我读过 await/async 不应该创建/使用新线程,但编译器在幕后创建了一个 astate 机器......所以我尝试了这个,并且每次调用 F1 都使用来自 ThreadPool 的线程。class Program{    static System.Threading.SemaphoreSlim sem =        new System.Threading.SemaphoreSlim(20, 20);    static async void F1()    {        await sem.WaitAsync();        await sem.WaitAsync();        await Task.Delay(6000);        var threadId = GetCurrentThreadId();        sem.Release();        sem.Release();    }    static void Main(string[] args)    {        var threadId = GetCurrentThreadId();        F1();        F1();        F1();        F1();        F1();        F1();        F1();        F1();        Task.Delay(30000).Wait();    }    [DllImport("kernel32.dll")]    static extern uint GetCurrentThreadId();}

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

您已经使用了await Task.Delay(6000),它保证不会同步完成,因此:完成将通过它可以返回的任何方式返回 - 通常是线程池(因为这里没有同步上下文在起作用)。线程池线程很便宜,只要你不长时间捆绑它们;如果它所做的只是捕获当前线程 id 并释放,它们应该在它们触发后几乎立即完成。

代码需要在某处运行;你希望它在什么线程上运行?您的主线程当前处于阻塞Wait()调用中,因此它无法执行任何操作。注意:您几乎不应该调用.Wait()不完整的Task.


查看完整回答
反对 回复 2021-06-05

添加回答

代码语言

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信