C# 运行Foreach循环Aysnc

C# 运行Foreach循环Aysnc,c#,C#,我在异步更新产品状态时遇到了一个小问题,所以需要您的帮助来解决这个问题 下面是我的两种方法。一个是更新单个产品状态,另一个是更新多个产品状态。在UpdateInventoryStatusofMultipleProduct方法中,我必须调用UpdateInventoryStatusofSingleProduct来更新多个产品的状态。 要更新每个产品状态,需要一些时间。当我更新多个产品的状态时,我不想等待其他产品状态的更新。我的意思是我想异步更新产品的状态 public bool UpdateInv

我在异步更新产品状态时遇到了一个小问题,所以需要您的帮助来解决这个问题

下面是我的两种方法。一个是更新单个产品状态,另一个是更新多个产品状态。在
UpdateInventoryStatusofMultipleProduct
方法中,我必须调用
UpdateInventoryStatusofSingleProduct
来更新多个产品的状态。 要更新每个产品状态,需要一些时间。当我更新多个产品的状态时,我不想等待其他产品状态的更新。我的意思是我想异步更新产品的状态

public bool UpdateInventoryStatusofSingleProduct(Product product)
{      
    result = this.inventory.UpdateProductStatus(storageLocation, state);
    Thread.Sleep(1000); //Allow the System to update status
    return result;  
}

public bool UpdateInventoryStatusofMultipleProduct(List<Product> products)
{      
    //How to change foreach loop to run asynchronously
    foreach (var product in products)
    {
       bool result = UpdateInventoryStatusofSingleProduct(product);  
    }                 
}

是不是并行。ForEach你想要什么

public bool UpdateInventoryStatusofMultipleProduct(List<Product> products)
{
    Parallel.ForEach(products, product => UpdateInventoryStatusofSingleProduct(product));
}
public bool UpdateInventoryStatusofMultipleProduct(列出产品)
{
Parallel.ForEach(products,product=>UpdateInventoryStatusofSingleProduct(product));
}

它执行一个
foreach
操作,在该操作中迭代可以并行运行:

正如@mm8所说,您可以对每个任务进行并行处理,或者如果您想使用任务,您可以通过以下类似方式创建一个新任务:

foreach (var product in products)
{
   tasks.Add(Task.Factory.StartNew(() => UpdateInventoryStatusofSingleProduct(product)));  
}

await Task.WhenAll(tasks); ...

首先,为什么在更新中有任意线程睡眠。上游有点不对劲。当你说异步时,你真的是指在后台,不是吗?如果“我不想等待其他产品状态更新”,你不想异步更新,你想并行更新状态。为此,您可以使用我相信Parallel.ForEach对我有效请记住接受我的答案并投票表决:Parallel不会异步运行。不会,但它会并行运行操作。你的观点是什么?OP要求在个别产品更新时报告进度。并行可能会很快完成,但除非所有产品都更新,否则它将被卡住。如果出于任何原因要卸载调用线程,则应在另一个线程上调用整个UpdateInventoryStatusofMultipleProduct方法。@mm8您不会释放线程,OP正在执行一个线程休眠,它将阻塞1秒,而不是正确地实现异步。当您可以使用内置的Parallel.ForEach方法并行执行操作时,为什么要为每个产品启动一个任务?谁知道,他在询问任务。为什么您通常会使用thread.sleep一秒钟?对于上面的代码,我需要将我的方法更改为Async,并且返回类型应该是Task,这是我不想做的…因此我计划使用Parallel.ForEach
foreach (var product in products)
{
   tasks.Add(Task.Factory.StartNew(() => UpdateInventoryStatusofSingleProduct(product)));  
}

await Task.WhenAll(tasks); ...