讓我前言這個問題,有幾件事情:混合異步/等待着結果
- 我讀過一些做題說你應該不做到這一點(如How to safely mix sync and async code)
- 我讀過Async/Await - Best Practices in Asynchronous Programming再次說你不應該這樣做
所以我不知道這是不是最好的做法,並且不需要任何人告訴我這樣的。這更像是「爲什麼這項工作」的問題。
有了這樣的方式,這裏是我的問題:
我已經寫了有2個按鈕和狀態標籤一個小的GUI應用程序。其中一個按鈕會在100%的時間內同步和異步重現死鎖問題。另一個按鈕調用相同的異步方法,但它被包裝在一個任務中,這個工作。我知道這不是一個好的編碼習慣,但我想了解爲什麼它不具有相同的死鎖問題。下面是代碼:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async Task<string> DelayAsync()
{
await Task.Delay(1000);
return "Done";
}
private void buttonDeadlock_Click(object sender, EventArgs e)
{
labelStatus.Text = "Status: Running";
// causes a deadlock because of mixing sync and async code
var result = DelayAsync().Result;
// never gets here
labelStatus.Text = "Status: " + result;
}
private void buttonWorking_Click(object sender, EventArgs e)
{
labelStatus.Text = "Status: Running";
string result = null;
// still technically mixes sync and async, but works, why?
result = Task.Run(async() =>
{
return await DelayAsync();
}).Result;
labelStatus.Text = "Status: " + result;
}
}
正是我想要的,謝謝你的快速答覆。 – Middas