簡體   English   中英

通用參數數目可變的C#方法

[英]c# method with variable number of generic parameters

我正在嘗試與ebay Api合作,他們說您最多只能使用18個線程來處理請求+處理重試。

所以我試圖做一個包裝,將執行我所有的ebay命令。

問題是我對ebay的請求類型很多,具有不同數量的參數,所以我試圖了解如何將它們全部發送到包裝器並獲得所需的結果。

也許這根本不是實現此目標的最佳方法,但我不確定如何實現此目標。

private static SemaphoreSlim sem = new SemaphoreSlim(18);
private static int retryCount = 2;

public static async Task<T> RunTask<T, V>(Func<V, T> ebayAction, V param1)
{
  // Wait the semaphore.
  await sem.WaitAsync();
  int currentRetry = 0;
  for (; ; )
  {
    try
    {
      // If response failed try again.
      return await Task.Run(() => ebayAction(param1));
    }
    catch (Exception e)
    {
      currentRetry++;
      if (currentRetry >= retryCount)
      {
        throw e;
      }
    }
    finally
    {
      sem.Release();
    }
  }
}

用法示例:

private List<ProductData> SearchItems(string keyword)
{
  return EbayApiRequestFactory.Create<EbayFindApiRequest>()
    .SetKeyword(keyword)
    .SetEntriesLimit(100)
    .Execute().Result;
}

List<ProductData> searchProducts = await EbayHandler.RunTask(SearchItems, keyword);

我將如下更改您的包裝器簽名:

async Task<TResult> RunTask<TResult>(Func<TResult> ebayAction)

並運行為

RunTask(() => SearchItems(keyword));

如果您有另一個帶有其他數量參數的方法:

RunTask(() => SearchItems(keyword, argument2, argument3));

您可以根據需要添加更多重載,例如:

// some action which does not return result
static async Task RunTask(Action ebayAction)
// some function which is already asynchronous so you don't need
// to wrap it into Task.Run
static async Task<TResult> RunTask<TResult>(Func<Task<TResult>> ebayAction)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM