2017-08-15 159 views
3

我需要異步調用Web服務上的Register()方法(使用C#)。 Web服務中實際的Register方法的實現不會返回任何值。但是如果方法失敗,它會引發異常。鑑於此,下面的代碼看起來好嗎?異步調用webservice方法

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


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

感謝您的幫助。

+2

您是否要求進行代碼審查?更好的地方是https://codereview.stackexchange.com。如果您遇到此代碼的任何問題,請解釋。 –

+2

(1)你的'async'方法應該返回一個'Task',而不是'void'。 (2)日誌記錄應該包括被捕獲的實際異常。 (3)爲什麼調用方法不等待操作? 「火和忘記」有一個令人討厭的傾向,被遺忘。不要模糊異步操作,需要調用代碼來了解它們。 – David

回答

0

我可能會寫下面的代碼:

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; 
    } 

繼規則「異步」的所有道路。

+0

感謝Joe.Sorry,我沒有提到,但RegisterProduct()方法是我的類正在實現的接口的一部分。並且在接口中,該方法的簽名具有空白,而不是任務。 – Jimmy

0

添加服務後,我猜你知道生成了一個代理文件。

在代理文件中,您可以記下關聯的async函數,該函數返回System.Threading.Tasks.Task<xxxxxx>作爲返回值。

因此,在您的情況下爲Register,您可以在代理文件中記錄功能RegisterAsync(string)

您可以調用該函數(在您的情況下:RegisterAsync(string))進行異步調用。

myWebService.RegisterAsync(productName);