【发布时间】: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<T> ebayAction,EbayHandler.RunTask(() => SearchItems(keyword)). -
如果您想限制并发请求,为什么不使用信号量为 HttpClient 创建一个处理程序?
标签: c# asp.net generics generic-programming ebay-api