1

多かれ少なかれ 3 つの異なる非同期メソッドを呼び出してから、成功メッセージを含む「結果」​​オブジェクトを返すメソッドがあります。これら 3 つの非同期メソッドのいずれかが をスローする可能性があるため、3 つすべてを をトラップし、 を処理し、失敗結果オブジェクトを返すSshException内に配置しました。try{}catch{}AggregateExceptionSshException

私は .Net 4.0 を使用しているため、async/await を使用することはできません (これで問題を簡単に解決できると思います) が、メソッドを次の 2 つの結果のいずれかを含む Task を返すメソッドに変えたいと思います。

  1. 前の 3 つのタスクがすべて正常に完了した場合は「成功」。
  2. 前のタスクのいずれかに失敗した場合は「失敗」 。理想的には、タスクの実行も最初にキャンセルされたタスクで停止します (たとえば、3 つの作業タスクの TaskContinuationOptions.NotOnFaulted)。

サンプルコードは次のとおりです。

public UploadResult UploadFileToDir(string dir, string text)
{
    try
    {
        SftpClient.Cd(dir).Wait();  // This is a Task
        var filename = this.GetFilename().Result;  // This is also a Task
        SftpClient.WriteFile(filename, text).Result;  // This is the last Task
        return UploadResult.Success;
    }
    catch(AggregateException agg)
    {
        if(agg.InnerException is SshException)
        {
            return UploadResult.Failure;
        }
        throw;
    }
}
4

1 に答える 1

4

.NET 4 プロジェクトで/を使用できるようにするMicrosoft.Bcl.Asyncを使用することをお勧めします。それはあなたが書くことを可能にするでしょう:asyncawait

public async Task<UploadResult> UploadFileToDir(string dir, string text)
{
    try
    {
        await SftpClient.Cd(dir)
        var filename = await this.GetFilename();
        await SftpClient.WriteFile(filename, text);
        return UploadResult.Success;
    }
    catch(SshException ex)
    {
        return UploadResult.Failure;
    }
}

それがなければ、各タスクを前のタスクの継続として実行し、最終的なタスクの継続を返すか、既存のコードを取得してTask.Factory.StartNew呼び出しでラップする必要があります (これもあまり良くありません。その後、async over sync over async を実行しますが、これは非常に非効率的です)。これにより、大量のコードが作成され、全体的なフローをたどるのがはるかに難しくなります。

于 2013-05-02T16:44:13.363 に答える