C# 在控制台应用程序中运行时):
然后C# 在控制台应用程序中运行时):,c#,.net,multithreading,task-parallel-library,async-await,C#,.net,Multithreading,Task Parallel Library,Async Await,然后 while (true) { StartDownload().Wait(); } 还要注意,混合使用Parallel.Foreach和async wait并不总是最好的主意。你可以在中了解更多,是的,我也这么认为,但它给了我一个错误,任务不包含ResultI的定义。我更新了我的代码,但我仍然得到一个错误,任务不包含resultw的定义。如果我想多次调用该方法,正确的代码会是什么样子?是的,我也这么认为,但它给我一个错误,任务不包含结果的定义我更新了我的代码,我仍然得到一个错误,任
while (true)
{
StartDownload().Wait();
}
还要注意,混合使用
Parallel.Foreach
和async wait
并不总是最好的主意。你可以在中了解更多,是的,我也这么认为,但它给了我一个错误,任务不包含ResultI的定义。我更新了我的代码,但我仍然得到一个错误,任务不包含resultw的定义。如果我想多次调用该方法,正确的代码会是什么样子?是的,我也这么认为,但它给我一个错误,任务不包含结果的定义我更新了我的代码,我仍然得到一个错误,任务不包含结果的定义如果我想多次调用该方法,正确的代码会是什么样子?你是在寻找一个任务
数组还是一个字典
数组,下载.更新SYMBOLSINDB返回什么?公共静态异步任务getHistoricalStockData(字符串[]符号,字符串市场)我需要传入Task@MikeGuthrieupdateSymbols方法如下所示,并返回void public static void updateSymbolsInDB(字典错误)updateSymbolsInDB
会为getHistoricalStockData
的每个结果运行一次吗,还是应该只在所有getHistoricalStockData
结果的集合上运行一次?您是在寻找一个任务数组还是一个字典数组,下载.更新SYMBOLSINDB
返回什么?公共静态异步任务getHistoricalStockData(字符串[]符号,字符串市场)我需要传入Task@MikeGuthrieupdateSymbols方法如下所示,并返回void public static void updateSymbolsInDB(字典错误)updateSymbolsInDB
会为getHistoricalStockData
的每个结果运行一次吗,还是应该只在所有getHistoricalStockData
结果的集合上运行一次?@user3610374在我完全理解您的意图之前,我已经回答过了,因此我是如何回答的。然而,这是我推荐的答案,因为它最终会得到更可读的代码。如果您仍然只需要一个下载.updateSymbolsInDB
调用,您可以使用聚合
逻辑替换foreach
块,就像我在回答中包含的那样。我忘了提一件重要的事情。我让这段代码在循环中运行,它应该在24小时后再次运行,但我使用的是Task.Delay(TimeSpan.FromHours(24)).Wait();这实际上并不是等24小时。它一次又一次地运行代码。有没有更好的方法可以使用您提到的单行方法来运行此操作?为什么要使用等待
?如果此代码在一些while
循环中运行,只需使用wait Task.Delay(TimeSpan.FromHours(24))代码>我也试过了,但都没用。我在while循环中插入了一条特征线,它不断调用方法并运行代码,这不是我想要的。我相信wait是一个非阻塞调用,因此它会继续正常运行?因为我所做的只是下载数据并尽快将其保存到数据库中,我应该坚持使用TPL还是使用TPL Dataflow,还是坚持使用async并等待任务?@user3610374在我完全理解您的意图之前,我已经回答过了,我就是这样回答的。然而,这是我推荐的答案,因为它最终会得到更可读的代码。如果您仍然只需要一个下载.updateSymbolsInDB
调用,您可以使用聚合
逻辑替换foreach
块,就像我在回答中包含的那样。我忘了提一件重要的事情。我让这段代码在循环中运行,它应该在24小时后再次运行,但我使用的是Task.Delay(TimeSpan.FromHours(24)).Wait();这实际上并不是等24小时。它一次又一次地运行代码。有没有更好的方法可以使用您提到的单行方法来运行此操作?为什么要使用等待
?如果此代码在一些while
循环中运行,只需使用wait Task.Delay(TimeSpan.FromHours(24))代码>我也试过了,但都没用。我在while循环中插入了一条特征线,它不断调用方法并运行代码,这不是我想要的。我相信wait是一个非阻塞调用,所以它只是继续进行,对吗?因为我所做的只是下载数据并尽快将其保存到数据库中,我应该坚持使用TPL还是使用TPL Dataflow,还是坚持使用async并等待任务?
await Task<Dictionary<string, string>>
.WhenAll(historicalGroups.Select(g => Task.Factory.StartNew(() => Downloads.getHistoricalStockData(g, market))))
.ContinueWith((i) => Downloads.updateSymbolsInDB(i.Result.Aggregate((agg, next) =>
{
foreach (var p in next)
{
if (!agg.ContainsKey(p.Key)) { agg.Add(p.Key, p.Value); }
}
return agg;
})));
IEnumerable<string> symbolList = Helper.getStockSymbols(market);
var historicalGroups = symbolList.Select((x, i) => new { x, i })
.GroupBy(x => x.i / 100)
.Select(g => g.Select(x => x.x).ToArray());
Parallel.ForEach(historicalGroups, g => Downloads.updateSymbolsInDB(Downloads.getHistoricalStockData(g, market)));
var historicalGroups = symbolList
.Select((x, i) => new { x, i })
.GroupBy(x => x.i / 100)
.Select(g => g.Select(x => x.x).ToArray());
var historicalTasks = historicalGroups.Select(x => Task.Run(() =>
Downloads.getHistoricalStockData(x, market)))
.ToArray();
var historcalStockResults = await Task.WhenAll(historicalTasks);
foreach (var dictionary in historcalStockResults)
{
Downloads.updateSymbolsInDB(dictionary);
}
await Task.Delay(TimeSpan.FromHours(24));
public async Task StartDownload()
while (true)
{
StartDownload().Wait();
}