具有可变数量的泛型参数的 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)
我正在尝试使用 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)