Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在控制台应用程序中运行时):_C#_.net_Multithreading_Task Parallel Library_Async Await - Fatal编程技术网

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();
}