我有看起來像這樣的方法:如何安全地等待異步方法?
static async Task<string> GetGooglePage(ProxyInfo proxy)
{
using (var m=new MyNetworkClass())
{
m.Proxy = proxy;
return await m.GetAsync("http://www.google.com");
}
}
現在我想從一個沒有異步方法調用它,並得到結果。
我試圖做到這一點是這樣的方式:
foreach (var proxy in proxys)
{
try
{
GetGooglePage(proxy.ToProxyInfo()).Wait();
}
catch
{}
lock (Console.Out)
{
Console.Write(current++ + "\r");
}
}
我的問題是,有時GetGooglePage(proxy.ToProxyInfo()).Wait();
死鎖(根據Visual Studio調試器,不存在堆棧超出此調用)。
我不想使用異步一直到Main()
。如何從同步代碼中正確調用GetGooglePage
而不會冒死鎖?
我沒有看到任何導致死鎖的代碼。它是如何發生的? –
@SriramSakthivel原因在於問題。 GetGooglePage的'return'在主線程可用之前沒有機會運行,但它不會變得可用,因爲它正在等待'GetGooglePage'完成。 – hvd
你爲什麼在你的例子中鎖定?用你寫代碼的方式,它是以串行方式運行的。 – Matthew