具有可变数量的通用参数的c#方法

时间:2017-11-01 11:50:22

标签: c# asp.net generics generic-programming ebay-api

我试图使用ebay Api,他们说你应该只有最多18个线程 处理请求+处理重试。

所以我试图制作一个能够执行所有ebay命令的包装器。

问题是我对ebay有很多不同类型的请求,参数数量不同,所以我试图了解如何将它们全部发送到我的包装器并获得我需要的结果。 / p>

也许这根本不是实现这一目标的最佳方法,我不确定如何实现这一点。

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

1 个答案:

答案 0 :(得分:0)

我按照以下方式更改您的包装签名:

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)