Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# 并行for循环问题_C#_Asynchronous - Fatal编程技术网

C# 并行for循环问题

C# 并行for循环问题,c#,asynchronous,C#,Asynchronous,我试图加载一个完整的auctionhouse,方法是从api调用异步加载每个页面,并将所有相同的项放在字典的列表中。当我创建并行for循环时,它不会返回任何东西。我们会感谢你的帮助 祝你今天愉快! -维克斯 { 字符串url=”https://api.hypixel.net/skyblock/auctions"; //获取要在拍卖行上制作线程的页数。。。 使用(HttpResponseMessage response=wait-ApiHelper.GetApiClient(“应用程序/json”

我试图加载一个完整的auctionhouse,方法是从api调用异步加载每个页面,并将所有相同的项放在字典的列表中。当我创建并行for循环时,它不会返回任何东西。我们会感谢你的帮助

祝你今天愉快! -维克斯

{
字符串url=”https://api.hypixel.net/skyblock/auctions";
//获取要在拍卖行上制作线程的页数。。。
使用(HttpResponseMessage response=wait-ApiHelper.GetApiClient(“应用程序/json”).GetAsync(url))
{
if(响应。IsSuccessStatusCode)
{
AuctionHouseModel auctionHouse=等待响应.Content.ReadAsAsync();
返回auctionHouse.Pages;
}
其他的
{
返回0;
}
}
}
私有静态异步任务LoadHypixelAuctionPage(int页,字符串apiKey)
{
//加载实体页面。。。
字符串url=”https://api.hypixel.net/skyblock/auctions?key=“+apiKey+”&page=“+page;
使用(HttpResponseMessage response=wait-ApiHelper.GetApiClient(“应用程序/json”).GetAsync(url))
{
if(响应。IsSuccessStatusCode)
{
return wait response.Content.ReadAsAsync();
}
其他的
{
返回null;
}
}
}
公共异步静态任务LoadHypixelAuctionHouse(字符串apiKey)
{
//加载所有需要的页面并将其放入字典。。。
列表页=新列表();
AuctionHouseModel输出=新的AuctionHouseModel();
Parallel.For(1,wait LoadHypixelAuctionPages(),async page=>{
pages.Add(wait LoadHypixelAuctionPage(page,apiKey));//这将不返回任何内容,页面计数保持为0,并且不会发生任何事情。。。
});
foreach(AuctionPageModel页面中的页面)
foreach(第页产品中的AuctionProductModel产品)
尝试
{
output.Products[product.Name].Add(产品);
}
抓住
{
output.Products.Add(product.Name,new List());
output.Products[product.Name].Add(产品);
}
output.Pages=await LoadHypixelAuctionPages();
返回输出;
}

在执行并行编程时,需要确保使用线程安全类型或锁定。可能还有更多的错误,但您需要修复的第一件事是确保锁定对
页面的访问。其次,中的第一个参数是包含的,而第二个参数是排除的。因此,如果
LoadHypixelAuctionPages()
返回0或1,则循环内不会运行任何内容,因此,如果第一个页码为1而不是0,则您可能是指
LoadHypixelAuctionPages()+1

List<AuctionPageModel> pages = new List<AuctionPageModel>();
AuctionHouseModel output = new AuctionHouseModel();

Parallel.For(1, await LoadHypixelAuctionPages() + 1, async page =>
{
    var loadedPage = await LoadHypixelAuctionPage(page, apiKey);
    lock(pages)
    {
        pages.Add(loadedPage);
    }
});

//...
列表以查看未锁定时可能发生的情况


锁定的另一种替代方法是使用其中一种,例如,在执行并行编程时,需要确保使用线程安全类型或锁定。可能还有更多的错误,但您需要修复的第一件事是确保锁定对
页面的访问。其次,中的第一个参数是包含的,而第二个参数是排除的。因此,如果
LoadHypixelAuctionPages()
返回0或1,则循环内不会运行任何内容,因此,如果第一个页码为1而不是0,则您可能是指
LoadHypixelAuctionPages()+1

List<AuctionPageModel> pages = new List<AuctionPageModel>();
AuctionHouseModel output = new AuctionHouseModel();

Parallel.For(1, await LoadHypixelAuctionPages() + 1, async page =>
{
    var loadedPage = await LoadHypixelAuctionPage(page, apiKey);
    lock(pages)
    {
        pages.Add(loadedPage);
    }
});

//...
列表以查看未锁定时可能发生的情况


锁定的另一种方法是使用其中一种方法,例如您不能将任何
并行
方法与
异步
一起使用。并行用于CPU绑定的代码,
async
主要用于I/O绑定的代码。
Parallel
类不能正确理解任何
async

您需要的不是并行并发,而是异步并发(
Task.whalll
):


您不能将任何
并行
方法与
异步
一起使用。并行用于CPU绑定的代码,
async
主要用于I/O绑定的代码。
Parallel
类不能正确理解任何
async

您需要的不是并行并发,而是异步并发(
Task.whalll
):


谢谢我明天会调查的谢谢!我明天会调查的谢谢你!我现在就去调查。它成功了,非常感谢。如果你看到这个评论,你能解释一下吗?我可以找到关于这个语法的信息。我是一名新编程人员,我也想使用这种语法。@Vexea:这是
async
/
wait
与LINQ的组合。谢谢!我现在就去调查。它成功了,非常感谢。如果你看到这个评论,你能解释一下吗?我可以找到关于这个语法的信息。我是一名新编程人员,我也想使用这种语法。@Vexea:这是
async
/
wait
与LINQ的组合。
List<AuctionPageModel> pages = new List<AuctionPageModel>();
AuctionHouseModel output = new AuctionHouseModel();

var tasks = Enumerable
    .Range(1, await LoadHypixelAuctionPages())
    .Select(async page => pages.Add(await LoadHypixelAuctionPage(page, apiKey)))
    .ToList();
await Task.WhenAll(tasks);
AuctionHouseModel output = new AuctionHouseModel();

var tasks = Enumerable
    .Range(1, await LoadHypixelAuctionPages())
    .Select(async page => await LoadHypixelAuctionPage(page, apiKey))
    .ToList();
var pages = await Task.WhenAll(tasks);