多かれ少なかれ 3 つの異なる非同期メソッドを呼び出してから、成功メッセージを含む「結果」オブジェクトを返すメソッドがあります。これら 3 つの非同期メソッドのいずれかが をスローする可能性があるため、3 つすべてを をトラップし、 を処理し、失敗結果オブジェクトを返すSshException
内に配置しました。try{}catch{}
AggregateException
SshException
私は .Net 4.0 を使用しているため、async/await を使用することはできません (これで問題を簡単に解決できると思います) が、メソッドを次の 2 つの結果のいずれかを含む Task を返すメソッドに変えたいと思います。
- 前の 3 つのタスクがすべて正常に完了した場合は「成功」。
- 前のタスクのいずれかに失敗した場合は「失敗」 。理想的には、タスクの実行も最初にキャンセルされたタスクで停止します (たとえば、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;
}
}