此代码执行您所期望的操作:快速连续单击两次按钮将启动两个任务并使用两个不同的局部变量值打印两条消息。
private bool _dummy;
private async void button1_Click(object sender, EventArgs e)
{
int a;
if (_dummy == false)
{
a = 1;
_dummy = true;
}
else
{
a = 99;
_dummy = false;
}
Debug.WriteLine($"{DateTime.Now:HH:mm:ss:fff} {Thread.CurrentThread.ManagedThreadId} {a} click pre delay");
Task dtask = Task.Delay(2000);
await dtask;
Debug.WriteLine($"{DateTime.Now:HH:mm:ss:fff} {Thread.CurrentThread.ManagedThreadId} {a} {dtask.Id} click post delay");
}
结果消息:
15:21:52:111 1 1 click pre delay
15:21:52:595 1 99 click pre delay
15:21:54:120 1 1 7 click post delay
15:21:54:615 1 99 9 click post delay
问题是:什么机制可以实现这一点?该方法的第一次等待后恢复如何为本地值维护一个单独的堆栈,并如何与第二次等待后恢复保持分离? 我知道(或者至少有一个模糊的概念)线程具有独立的堆栈,但在这种情况下,所有内容都在单个 GUI 线程上(通过打印
ManagedThreadId
进行验证。)
[这个问题类似于https://stackoverflow.com/questions/54941894/c-sharp-async-how-does-a-thread-remember-its-local-variables,但我不知道我是否会将它们视为真正的重复项。我的问题特别是关于解开暂时重叠的调用。]