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

本文关键字:一个 新线程 线程 创建 调用 异步 void 方法 是否 | 更新日期: 2023-09-27 17:50:15

我有以下场景:

async void DoStuff() {
    // ...
}
button1.Click += (s, p) => {
    DoStuff();
};

我不确定当我调用async void方法而第一次调用仍然不完整时会发生什么。每次调用都会创建一个新线程,还是会销毁并覆盖之前创建的线程?此外,如果前一种假设是正确的,局部方法变量将被共享吗?

编辑:

我误解了async await的事情,因为在windows 8应用程序中,它的行为不同。如果你像我一样认为调用异步方法等同于创建一个新线程,请阅读这篇澄清文章。

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

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

你的意思是如果另一个调用发生,而第一个调用仍然不完整(可能"暂停")?它会工作得很好。没有"压倒",没有"摧毁"。您将得到状态机的另一个实例(这是编译器为您构建的)。

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

不要忘记,启动一个异步方法并不会启动一个新线程。在 async方法中启动的一些异步操作可能会启动新线程,但这是另一回事。生成的代码中不会创建新线程。

No.

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

每个await之后的代码将在可等待对象运行回调的线程上运行。
这完全取决于你要await的内容。
通常,您将使用awaitTask对象,它们默认情况下在UI线程上运行它们的回调。