所以我明白为什么从异步函数返回void通常没有意义,但我遇到了一种情况,我认为这是完全有效的。考虑下面这个人为的例子:
我知道这个例子很不寻常,但我尽量让它简单且更通用。有人能解释一下为什么这段代码很糟糕,以及我应该如何修改它以正确遵循规范吗?
谢谢任何帮助。
protected override void OnLoad(EventArgs e)
{
if (CustomTask == null)
// Do not await anything, let OnLoad return.
PrimeCustomTask();
}
private TaskCompletionSource<int> CustomTask;
// I DO NOT care about the return value from this. So why is void bad?
private async void PrimeCustomTask()
{
CustomTask = new TaskCompletionSource<int>();
int result = 0;
try
{
// Wait for button click to set the value, but do not block the UI.
result = await CustomTask.Task;
}
catch
{
// Handle exceptions
}
CustomTask = null;
// Show the value
MessageBox.Show(result.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
if (CustomTask != null)
CustomTask.SetResult(500);
}
我知道这个例子很不寻常,但我尽量让它简单且更通用。有人能解释一下为什么这段代码很糟糕,以及我应该如何修改它以正确遵循规范吗?
谢谢任何帮助。
async void
异常无法在Main
中捕获。而BackgroundWorker
没有同样的问题(尽管它有其他问题)。 - Stephen Cleary