1

C# 5 での async await の統合は初めてです。async await と TPL を調査するために、いくつかの基本的な Task ベースのメソッドを使用しています。以下の例では、5 秒のタイムアウトで Web サービスを呼び出しています。タイムアウトが切れた場合は例外をスローする必要があるため、メソッドから false を返すことができます。ただし、タイムアウトは発生しないか、発生してもタスクが返されません。

public static Task<bool> IsConnectedAsync()
{
    return Task.Run(() =>
    {
        try
        {
            using (WSAppService.AppService svc = new NCSoftware.Common.WSAppService.AppService(GetServiceUrl(WebService.app)){Timeout = 5000})
            {
                return svc.PingB();
            }
        }
        catch (Exception ex)
        {
            Logger.LogException(ex.Message, ex, "IsConnectedAsync");
        }    
        return false;
    });
}

タイムアウトが発生した場合、または例外が発生した場合でも、タスクが返されるように、これを適切に処理する方法を教えてください。

4

1 に答える 1

1

一般に、サービスTask.Runをラッピングする場合は使用しないでください。これはサービス参照であるため、サービスからメソッド (を返す) を直接async公開できるはずです。その場合は、次を使用できます。asyncTask

public async static Task<bool> IsConnectedAsync()
{
    try
    {
         using (WSAppService.AppService svc = new NCSoftware.Common.WSAppService.AppService(GetServiceUrl(WebService.app)){Timeout = 5000})
         {
              return await svc.PingBAsync();
         }
     }
     catch (Exception ex)
     {
         Logger.LogException(ex.Message, ex, "IsConnectedAsync");
     }    
     return false;
}

経由でラップする必要がある場合Task.Run(繰り返しますが、スレッド プールを介して同期コードを非同期に変換するため、これはお勧めできません。これは通常、ユーザーが最上位レベルで処理する方が適切です)、次のようにすることができます。

public async static Task<bool> IsConnectedAsync()
{
    try
    {
       return await Task.Run(() =>
       {
         using (WSAppService.AppService svc = new NCSoftware.Common.WSAppService.AppService(GetServiceUrl(WebService.app)){Timeout = 5000})
         {
              return svc.PingB();
         }
       }
     }
     catch (Exception ex)
     {
         Logger.LogException(ex.Message, ex, "IsConnectedAsync");
         return false;
     }    
}
于 2013-08-09T18:10:40.307 に答える