我已经搜索了这个答案,但根据很多指南和SO问题,这段代码对我来说仍然显示正确,但它同步运行。为什么异步/等待不会异步运行?
private void CheckConditions()
{
foreach (var obj in myObjects)
{
if (obj.ConditionMet)
{
HandleConditionAsync(obj);
}
}
DoOtherWork();
}
private async void HandleConditionAsync(MyObject obj)
{
// shouldn't control transfer back to CheckConditions() here while we wait for user input?
string userInput = await obj.MessagePromptAsync("hello user");
DoSomeBookkeeping(obj);
}
// (MyObject.cs)
private MessagePrompt messagePrompt; // inherits from UserControl
public async Task<string> MessagePromptAsync(string prompt)
{
return await Task.FromResult<string>(messagePrompt.Prompt(prompt));
}
// (MessagePrompt.cs)
public string Prompt(string prompt)
{
this.UIThread(() => this.SetMessagePrompt(prompt));
userInputAutoResetEvent.WaitOne();
return myResult; // set in a button handler that also sets the AutoResetEvent
}
我打算为CheckConditions()欢快继续沿而是还停留在MessagePrompt的的AutoResetEvent尽管我异步/等待。我唯一能想到的可能是错误的是,由于UserControl的某些限制,它使用UI线程引用,或者可能是堆栈顶部的非异步方法,MessagePrompt的方法可能无法异步运行。
请注意,提供[MCVE]建议用于“调试我的代码”帖子。在这种情况下,你应该缩小为“为什么以下代码同步运行:'等待Task.FromResult(messagePrompt.Prompt(提示));'”,或者甚至可以等待Task.FromResult (“test”); 。否则,人们可能会试图解决其他无关的错误/混淆的代码位。 –
如果我知道在这个堆栈中,我的问题是在这段代码中,我不需要发布这个问题。 – pelotron
这是试图获得[MCVE]的全部观点 - 如果在大多数情况下,实际上花费时间尝试从样本中删除不相关部分的代码,问题会变得明显,或者至少显着更容易搜索/获取答案。 –