每次调用异步void方法时都会创建一个新线程吗?

Dan*_*San 5 .net c# async-await

我有以下场景:

async void DoStuff() {
    // ...
}

button1.Click += (s, p) => {
    DoStuff();
};
Run Code Online (Sandbox Code Playgroud)

我不确定当async void第一次调用仍未完成时调用方法时会发生什么.调用每次调用时都会创建一个新线程,还是调用会破坏并覆盖之前创建的线程?此外,如果前一个假设是正确的,那么本地方法变量是否会被共享?

编辑:

我误解了这个async await问题,因为在Windows 8应用程序中,它的行为有所不同.如果您认为调用异步方法与创建像我这样的新线程相同,请阅读此澄清文章.

Jon*_*eet 8

我不确定当我同时多次调用异步void方法时会发生什么

你的意思是,如果在第一个呼叫仍然不完整(可能是"暂停")时发生另一个呼叫?它会工作得很好.没有"压倒一切",没有"毁灭".您将最终得到另一个状态机实例(这是编译器为您构建的实例).

这两个状态机将具有完全独立的局部变量等.当然,其中只有一个实际上可以一次运行,除非异步方法中的某个地方避免捕获上下文.

不要忘记启动异步方法不会启动新线程.您异步方法中启动的某些异步操作可能会启动新线程,但这是另一回事.生成的代码中没有任何内容创建新线程.


SLa*_*aks 6

没有.

异步方法与线程无关.
相反,异步方法将在调用者的线程上执行其代码,就像常规方法调用一样,直到第一个await.

每个代码之后的代码await将在等待的线程上运行其回调.
这取决于你究竟是什么await.
通常情况下,你会被await荷兰国际集团Task的物体,它默认的UI线程上运行他们的回调.

  • 如果前一部分位于UI线程上,则continuation仅在UI线程上运行.如果UI线程忙,则在UI线程返回主消息泵之前,不能执行继续. (5认同)