5

我有以下情况:

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

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

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

编辑:

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

4

2 回答 2

8

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

您的意思是如果在第一个呼叫仍未完成(可能“暂停”)时发生另一个呼叫?它会工作得很好。没有“压倒一切”,也没有“破坏”。您将得到另一个状态机实例(这是编译器为您构建的)。

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

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

于 2012-12-30T22:26:27.333 回答
6

不。

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

每个之后的代码都await将在等待运行其回调的线程上运行。
这完全取决于你在做什么await
通常,您将生成对象,这些对象默认在 UI 线程上运行它们的回调awaitTask

于 2012-12-30T22:26:32.017 回答