我不想两次使用foreach
循环,所以我尝试使用LINQ,但遗憾的是这不起作用:
return _etags.ToDictionary(item => item.Key, async item => await item.Value);
有人可以告诉我应该怎样做才能改进我的代码,或者如何将Dictionary<string, Task<string>>
转换为Dictionary<string, string>
?
这是我的代码:
private static async Task<Dictionary<string, string>> GetETagsAsync(List<string> feedsLink)
{
var eTags = new Dictionary<string, string>(feedsLink.Count);
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
var _eTags = new Dictionary<string, Task<string>>(feedsLink.Count);
eTags = new Dictionary<string, string>(feedsLink.Count);
foreach (string feedLink in feedsLink)
{
if (Uri.IsWellFormedUriString(feedLink, UriKind.Absolute))
{
_eTags.Add(feedLink, GetETagAsync(feedLink));
}
else
{
throw new FormatException();
}
}
foreach (KeyValuePair<string, Task<string>> eTag in _eTags)
{
eTags.Add(eTag.Key, await eTag.Value);
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
return eTags;
}
答案 0 :(得分:3)
您不希望在启动某些任务后抛出异常,最好先验证。
private static async Task<Dictionary<string, string>> GetETagsAsync(List<string> feedsLink)
{
ValidateFeedsLinkFormat(feedsLink);
var _eTags = feedsLink.ToDictionary(f => f, f => GetETagAsync(f));
await TaskEx.WhenAll(_eTags.Values);
var eTags = _eTags.ToDictionary(k => k.Key, k => k.Value.Result);
return eTags;
}
此代码启动所有任务,就像您所做的那样,但只需一个等待所有链接。
您不希望在多个线程上使用Stopwatch实例:来自MSDN:&#34;不保证所有实例成员都是线程安全的。&#34;
您可以使用Stopwatch.GetTimestamp();
两次并比较结果。