2017-08-15 16 views
3

WebサービスでRegister()メソッドを非同期に(C#を使用して)呼び出す必要があります。実際のRegisterメソッドをWebサービスで実装しても値は返されません。しかし、メソッドが失敗した場合は例外がスローされます。これを考えると、次のコードは大丈夫ですか?Webサービスメソッドを非同期で呼び出す

public void RegisterProduct(string productName) 
{ 
    await RegisterProductAsync(); 
} 


private async static Task RegisterProductAsync(string productName) 
{ 
    try 
    { 
     await myWebService.Register(productName); 
    } 
    catch(Exception ex) 
    { 
     LogException(ex); 
    } 
} 

ありがとうございました。ルール「非同期」すべての道に続き

private async static Task<int> RegisterProductAsync(string productName) 
    { 
     try 
     { 
      await Task.Run(() => myWebService.Register(productName)); 
      return 0; 
     } 
     catch (Exception ex) 
     { 
      LogException(); 
      return 1; 
     } 
    } 

    public async Task<int> RegisterProduct(string productName) 
    { 
     var result = await RegisterProductAsync(productName); 
     return result; 
    } 

+2

コードレビューをリクエストしていますか?それはhttps://codereview.stackexchange.comの方がよいでしょう。このコードに問題がある場合は、説明してください。 –

+2

(1) 'async'メソッドは' void'ではなく 'Task'を返すべきです。 (2)ロギングには実際に捕捉された例外が含まれているはずです。 (3)なぜ呼び出すメソッドが操作を待っていないのですか? 「火と忘れ」は忘れ去られる厄介な傾向があります。非同期操作を隠してはいけません。呼び出しコードにそれらについて知る必要があります。 – David

答えて

0

は、私はおそらく、次のコードを記述します。

+0

ありがとうございましたJoe.Sorry、私は以前言及しなかったが、RegisterProduct()メソッドは、私のクラスが実装しているインターフェイスの一部です。そして、インターフェイスでは、そのメソッドの署名は無効で、タスクではありません。。 – Jimmy

0

サービスを追加すると、プロキシファイルが生成されることがわかります。

プロキシファイルでは、戻り値としてSystem.Threading.Tasks.Task<xxxxxx>を返す、関連付けられたasync関数をメモすることができます。

Registerの場合は、RegisterAsync(string)のプロキシファイルを書き留めることができます。

非同期呼び出しのためにその関数(あなたの場合はRegisterAsync(string))を呼び出すことができます。

myWebService.RegisterAsync(productName); 
関連する問題