C# 异步void方法是否每次调用时都创建新线程?

C# 异步void方法是否每次调用时都创建新线程?,c#,.net,async-await,C#,.net,Async Await,我有以下情况: async void DoStuff() { // ... } button1.Click += (s, p) => { DoStuff(); }; 当第一次调用仍然不完整时,我不确定调用async void方法时会发生什么。 调用会在每次被调用时创建一个新线程,还是会销毁并覆盖先前创建的线程?此外,如果前一个假设是正确的,局部方法变量会被共享吗 编辑: 我误解了异步等待这件事,因为在Windows8应用程序中,它的行为不同。如果您认为调用异步方法与创建

我有以下情况:

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

button1.Click += (s, p) => {
    DoStuff();
};
当第一次调用仍然不完整时,我不确定调用
async void
方法时会发生什么。 调用会在每次被调用时创建一个新线程,还是会销毁并覆盖先前创建的线程?此外,如果前一个假设是正确的,局部方法变量会被共享吗

编辑:

我误解了
异步等待
这件事,因为在Windows8应用程序中,它的行为不同。如果您认为调用异步方法与创建像我这样的新线程是一样的,请阅读

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

您的意思是,如果在第一个呼叫尚未完成(可能“暂停”)的情况下发生另一个呼叫?它会很好用的。没有“凌驾”,没有“毁灭”。您将得到状态机的另一个实例(编译器为您构建)

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

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

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

每个
wait
之后的代码将在waitiable运行其回调的线程上运行。
这完全取决于你在等待什么。

通常,您将是
wait
ing
Task
对象,默认情况下,这些对象在UI线程上运行回调。

我的意思是,当第一次调用仍在运行时incomplete@DanielSan:因此呢?异步方法仍然与线程无关。您是否在询问您在方法内调用的特定异步操作的行为?如果前一部分在UI线程上,则continuations仅在UI线程上运行。如果UI线程正忙,则在UI线程返回到主消息泵之前,无法执行继续。我正在pluralsight上观看您的视频,但仍不明白。我知道等待者的事情可能会马上结束,在这种情况下,不会发生任何事情。但是如果有实际的工作要做,并且UI线程接收到一个延续,那么默认情况下,这是否意味着UI线程在不忙的时候执行延续(这样就不会发生任何异步情况)?@dudeNumber4:不,延续只在任务完成时执行。。。但它是在UI线程中执行的。因此,是的,它需要在UI线程不忙做其他事情的时候,但它不是“每当”它不忙的时候。请注意,UI线程应该将大部分时间花在不忙上。