0

Task<T>コンパイル時に T が不明な場所と.を取得するメソッドがありIAsyncDisposableます。Task<T>元のタスクが完了した後、使い捨てオブジェクトを自動的に破棄するを返す必要があります。

これは私がこれまでに思いついたものですが、コンパイル時にエラーをスローしています

private static TResult AutoDispose<TResult>(TResult result, IAsyncDisposable asyncDisposable)
{
    Func<dynamic, dynamic> continuationFunction = async t => { await asyncDisposable.DisposeAsync(); return ((dynamic)t).Result; };
    var autoDisposing = ((dynamic)result).ContinueWith(continuationFunction);
    return (TResult)autoDisposing;
}

エラー、私が得ているのは

非同期ラムダ式をデリゲート型 'Func<dynamic, dynamic>' に変換できません。非同期ラムダ式は、void、Task、または Task を返す場合がありますが、いずれも 'Func<dynamic, dynamic>' に変換できません。

dynamicと のさまざまな組み合わせを既に試しTaskましたが、実用的なソリューションを作成できませんでした。コンパイル エラーまたは実行時エラーが常に発生します。

編集

なぜ私がこのようにしているのか混乱しているように見えるので:

IAsyncQueryProviderこれをsExecuteAsyncメソッド内で使用しています。インターフェイスは、メソッド署名を次のように定義します

public TResult ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken = default)

これに基づいてTResult、タイプIAsyncEnumerable<T>またはのいずれかであることがわかりますTask<T>。の場合を処理するコードを既に作成しましたが、 の場合IAsyncEnumerable<T>はまだ苦労していTask<T>ます。

4

2 に答える 2