我懷疑下面的「庫」方法是否會實際工作,或者最終會死鎖。在異步方法中使用鎖
我整個有一個「老」對象需要被保護,「鎖定」似乎是最好的工具,因爲有一些重入調用該資源(SomeSharedResource)「類」。
編輯:
1)將調用「計算」實際上阻止或最壞情況僵局?
var finalResult = await Compute(3).ConfigureAwait(false); // will this block?
2.)如果有人這樣做了?
var finalResult = Compute(3).Result; // will this block/deadlock?
3.)2線程調用同時:
var finalResult = await Compute(3).ConfigureAwait(false); // will this block?
在問題的方法:
private readonly object lockObject = new object();
private async Task<double> Compute(int input)
{
double result;
lock (lockObject) {
result = SomeSharedResource(input);
}
return await ComputeAsync(result).ConfigureAwait(false); // some other awaitable method
}
只有當你有兩個鎖時纔會發生死鎖。當第一個鎖被鎖定在第二個對象上並且第二個鎖被鎖定在第一個對象時。這裏沒有辦法導致死鎖。 (糾正我,如果我錯了) –