2017-11-01 8 views
1

私はeBay Apiで作業しようとしています。リクエスト処理+ハンドリングの再試行で最大18個のスレッド しか必要ありません。可変数のジェネリックパラメータを持つC#メソッド

私はすべての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(); 
    } 
    } 
} 

使用例:

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

をそして、あなたは別の方法を持っている場合

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

としてそれを実行します。

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

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

'のFunc ebayAction'、' EbayHandler.RunTask(()=> SearchItems(キーワード)) '。 –

+0

同時リクエストを制限しようとしている場合は、セマフォを持つHttpClientのハンドラを作成しないでください。 – john

答えて

0

私は次のようにあなたのラッパーの署名を変更したいです別の数の引数:

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) 
+0

ありがとうございました、私はそのような混乱を作った、私は前に同様の試みをしましたが、私はラッパーに送信されたパラメータが文脈から外れていると思うので、当時は機能しませんでした。 –

関連する問題