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

时间:2012-12-30 22:24:04

标签: c# .net async-await

我有以下情况:

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

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

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

编辑:

我误解了async await这个东西,因为在Windows 8应用程序中,它的行为有所不同。如果您认为调用异步方法与创建像我这样的新线程相同,请阅读this clarifying aricle

2 个答案:

答案 0 :(得分:8)

  

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

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

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

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

答案 1 :(得分:6)

没有

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

每个await之后的代码将在awaitable运行其回调的线程上运行 这取决于你await的确切内容 通常,您将await Task个{{1}}个对象,默认情况下会在UI线程上运行它们的回调。

相关问题