我们都知道保持UI线程的响应很重要,因此我们在各个地方实现了async/await。我正在构建一个文本编辑器,其中“所有内容”都是异步的。然而,现在我发现当代码运行之前,其他代码还没有完成时,它会受到UI线程竞争条件的影响。当然,这就是“响应式UI线程”的整个想法,即它可以在等待其他代码的同时运行代码。我需要一些代码来等待其他代码完成后再运行。我已经将问题简化为以下代码,其中我只是处理按键:
private async void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
//Wait until it's your turn (await HandleKey has returned) before proceeding
await HandleKey(e.KeyChar);
}
async Task HandleKey(char ch)
{
await GetCaretPosition();
Point newPosition = await Task.Delay(1000);
await SetCaretPosition(newPosition);
}
当第一个按键开始处理(等待)时,可以看到下一个按键可以开始处理。在这个简单的例子中,第二个按键处理代码将获得caretposition的旧值, 因为第一个按键处理尚未更新caretposition。 我如何使KeyPress事件中的代码等待第一个按键完成处理? 回到同步编码不是一个选项。