.net 如何批量获取c#事件更新

fiei3ece  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(98)

我在一个应用程序上工作,我订阅了一个事件,每当库存物品库存更新时就会触发。所以,每当我在那个事件中获得数据时,我都会调用一个API来更新shopify商店的库存。当物品批量更新时,比如一次更新100件物品时,这个委托会运行100次,有时我的shopify API会因为频繁更新而耗尽。

public void SomeMethod(Events event)
{
    event.InventoryStockUpdated += delegate (string itemNo){}
}

我尝试在列表中添加如下项目:

public void SomeMethod(Events event)
{
    var items = new List<string>();
    event.InventoryStockUpdated += delegate (string itemNo)
    {
        if(items.Count == 10)
        {
        // api request
        // Here the problem is the no is not always 10 and when the batch is less than 10 it wan't    run
        }
    }
}

我该怎么处理这种情况。要么一批一批地更新项目?但是我不知道那批更新的项目的固定数量。
我添加了thread.sleep(500),但这会导致太多的延迟。

yyyllmsg

yyyllmsg1#

我会建议做这样的事情

public static List<List<string>> Batch(List<string> list, int batchSize)
 {
    var result = new List<List<string>>();

    for (int i = 0; i < list.Count; i += batchSize)
    {
       result.Add(list.GetRange(i, Math.Min(batchSize, list.Count - i)));
    }
    
    return result;
 }

你就会这么做

List<string> list = new List<string> { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" };
int batchSize = 10;

List<List<string>> batches = BatchHelper.Batch(list, batchSize);

// Output
// ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
// ["eleven", "twelve"]

foreach(var b in batches){
//Send to API 
//This will also send our final batch of (2)
}

如果您希望辅助对象是动态的,则可以更进一步。

public static List<List<T>> Batch<T>(List<T> list, int batchSize)
{
    var result = new List<List<T>>();

    for (int i = 0; i < list.Count; i += batchSize)
    {
        result.Add(list.GetRange(i, Math.Min(batchSize, list.Count - i)));
    }

    return result;
}

相关问题