1. ホーム
  2. c#

[解決済み】非同期メソッドをアウトパラメータで書くには?

2022-04-01 12:01:54

質問

非同期メソッドに out パラメータは、こんな感じ。

public async void Method1()
{
    int op;
    int result = await GetDataTaskAsync(out op);
}

でどのように行うのですか? GetDataTaskAsync ?

解決方法は?

で非同期メソッドを持つことはできません。 ref または out パラメータを指定します。

Lucian WischikがこのMSDNスレッドで、なぜこれが不可能なのかを説明しています。 http://social.msdn.microsoft.com/Forums/en-US/d2f48a52-e35a-4948-844d-828a1a6deb74/why-async-methods-cannot-have-ref-or-out-parameters

<ブロッククオート

非同期メソッドが参照外パラメータをサポートしない理由については? (それはCLRの制限です。私たちは 非同期メソッドは、イテレータメソッドと同様の方法で実装されています。 つまり、コンパイラがそのメソッドを ステートマシン・オブジェクトです。のアドレスを保存する安全な方法はありません。 または参照パラメータをオブジェクトのフィールドとして使用します。 参照出力パラメータをサポートする唯一の方法は、次のような場合です。 非同期機能は、低レベルのCLRの書き換えによって行われ、その代わりに コンパイラ・リライト 私たちはその方法を検討し、多くのことを成し遂げました。 しかし、最終的にはコストがかかりすぎて、実現しなかったでしょう。 ということになります。

この状況に対する典型的な回避策は、非同期メソッドが代わりにタプルを返すようにすることです。 あなたのメソッドをそのように書き直すことができます。

public async Task Method1()
{
    var tuple = await GetDataTaskAsync();
    int op = tuple.Item1;
    int result = tuple.Item2;
}

public async Task<Tuple<int, int>> GetDataTaskAsync()
{
    //...
    return new Tuple<int, int>(1, 2);
}