【问题标题】:c# method with variable number of generic parameters具有可变数量的泛型参数的 c# 方法
【发布时间】:2017-11-01 11:50:22
【问题描述】:

我正在尝试使用 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);

【问题讨论】:

  • Func&lt;T&gt; ebayAction, EbayHandler.RunTask(() =&gt; SearchItems(keyword)).
  • 如果您想限制并发请求,为什么不使用信号量为 HttpClient 创建一个处理程序?

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


【解决方案1】:

我会改变你的包装签名如下:

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)

【讨论】:

  • 谢谢它的工作,我做了这么多的事情,我之前尝试过类似的东西,但我认为我发送给包装器的参数脱离了上下文,所以当时它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多