所以我明白爲什麼從異步返回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);
}
我意識到這是一個不尋常的例子,但我試圖使它簡單和更一般化。有人可以向我解釋爲什麼這是可怕的代碼,以及我如何修改它以正確遵循約定?
感謝您的任何幫助。
閱讀此項。 https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – Nkosi
@Nkosi我明白爲什麼這是一個不好的做法,但爲什麼我的代碼特別是這些不良做法的症狀?如果不使用void async,我該怎麼做呢? – AnotherProgrammer
@Nkosi該死的我不知道 –