我有一本異步呼叫字典。問題是有時這些異步呼叫會引發例外,但我不完全確定如何處理它們。GetUserLicenseTypes 回傳一個串列,所以如果我確實遇到例外,我仍然想回傳一個空串列。
var tasks = allCompanyUsers.ToDictionary(
u => u.Id,
u => _subscriptionService.GetUserSubscription(companyId, u.Id));
await Task.WhenAll(tasks.Values);
var licenseListByUserId = tasks.ToDictionary(
kvp => kvp.Key,
kvp => kvp.Value.Result);
下面的代碼不起作用,但我想做這樣的事情
var tasks = allCompanyUsers.ToDictionary(
u => u.Id,
u => {
try{
return _subscriptionService.GetUserSubscription(companyId, u.Id);
}catch{
return new List<string>();
}
});
await Task.WhenAll(tasks.Values);
var licenseListByUserId = tasks.ToDictionary(
kvp => kvp.Key,
kvp => kvp.Value.Result);
注意:我收到反饋說我應該一起避免例外,但目前很難做到,因為 GetUserSubscription 函式已經在許多地方使用,所以我們的應用程式使用的典型約定是處理這些拋出的錯誤的 trycatch 陳述句.
uj5u.com熱心網友回復:
這是一種方法:
async Task<IEnumerable<string>> GetSubscriptions(Guid userId)
{
try { return await _subscriptionService.GetUserSubscription(companyId, userId); }
catch { return new List<string>(); }
}
var idsWithSubscriptions = await Task.WhenAll(allCompanyUsers
.Select(async u => (
u.Id,
Subscription: await GetSubscriptions(u.Id))));
var licenseListByUserId = idsWithSubscriptions.ToDictionary(
iws => iws.Id,
iws => iws.Subscription);
因為等待Task回傳的 from GetUserSubscription,所以它會展開并拋出 any Exception,這意味著catch將回傳塊中的值。
uj5u.com熱心網友回復:
它看起來像你的字典值的型別Task<List<string>>,但是在你的 catch 塊中你回傳一個List<string>. 如果你回傳一個任務,它應該可以作業:
var tasks = allCompanyUsers.ToDictionary(
u => u.Id,
u =>
{
try
{
return _subscriptionService.GetUserSubscription(companyId, u.Id);
}
catch
{
return Task.FromResult(new List<string>());
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473231.html
