web-dev-qa-db-ja.com

非同期で新しいコードを書くが同期を呼び出す

新しいコードを書いていて、それをasyncとawaitを使用して記述したいのですが、呼び出し元のコードは現在asyncをサポートしていません。新しいコードを非同期で記述し、呼び出し側のコードが非同期をサポートするまで同期を呼び出すことは正しいですか?

または、コード同期を記述して、後で変換する必要がありますか?そして、それは技術的負債と考えられますか?

public Result Execute( Paramerters parameters ) {
    return ExecuteAsync( parameters ).Result;
}

public Task<Result> ExecuteAsync( Paramerters parameters ) {
    ...
}

Executeはインターフェイス上にあり、まだ非同期ではない他のコードから呼び出されます。非同期バージョンを作成し、Executeを呼び出すコードが非同期に変換されるまでExecuteから呼び出すことは正しいですか?私の古いコードは.net 4.5.1で書かれていますが、まだ非同期に変換されていません。

3
Jake Rote

非同期コードを同期的に呼び出す場合は、同期を処理する必要があります。私が持っている唯一のアイデアは、非同期操作が完了するまで呼び出しスレッドをブロックするということです。デッドロックにつながる可能性があるため、非常に危険だと考えます。特に、UIスレッドでタスクが実行されるようにスケジュールされているUIで作業している場合、その正確なスレッドをブロックします。ここの例: 非同期コードでブロックしない

したがって、呼び出し元を非同期バージョンに変更できるようになるまで、同期コードを記述します。

3
Euphoric

いずれにせよ、技術的な負債がありますが、私たちは最善を尽くすためにやらなければなりません。すぐに非同期に変更して待つ方が良い

あなたのコードはこれのようなものになるでしょう:

public Result Execute(string parameters)
{
    Task<Result> task = Task.Run<Result>(async () => await ExecuteAsync());
    return task.Result;
}

public async Task<Result> ExecuteAsync(string parameters)
{
    Task<Result> result = SomeOtherOperationAsync();
    // more code here...
    return await result;
}

それが役に立てば幸い

0
aelbouachri

なぜコードを非同期にしたいのですか?デザインが非同期呼び出しのサポートを必要とするためである場合は、async/awaitを使用して記述します。コードを非同期にする必要がない場合は、非同期にしないでください。要件が後で変更され、コードをリファクタリングする必要がある場合、それは技術的な負債ではなく、単に要件の変化に適応しています。 OTOH、それを非同期として記述し、それを同期的に呼び出すためのオーバーヘッドが発生する場合、それは悪い設計です。同様に、コードをデバッグしにくくし、理由もなく推論することも悪い設計です。したがって、フォワードパスが非同期であることが明確でない限り、同期を維持してください。

0
TMN