非同期メソッドのタスク結果を実行せずにキューに入れるにはどうすればよいですか?

スティーブンココ

後で実行するタスクのキューを保持するクラスがあり、async Task<T>メソッドがある場合、その非同期メソッドを実行せずにキューに入れるにはどうすればよいですか?

このタスクを「遅延」させたいので、メソッド本体で待機されているかのように、呼び出し元が後で実行されることを確認します。---呼び出し元は、私が後でタスクをキューに入れたことを知らないはずです。

現在、キューがいっぱいの場合Task<T>は、実行されていない新しいここを作成して返します。これ.Resultにより、プライベート非同期メソッドのが返されます。

public async Task<T> ExecuteAsync<T>(T transaction) {
    if (mustDelay) {
        Task<T> task = new Task<T>(t => executeAsync((T) t).Result, transaction);
        enqueue(task);
        return await task;
    }
    return await executeAsync(transaction);
}

private async Task<T> executeAsync<T>(T transaction) {
    await someWork();
    return transaction;
}

他のタスクが完了すると、Iはデキューし、Start()そのエンキューされたタスクは次のようになります。

dequeuedTask.Start();

これにより、呼び出し元は、メソッドから待機中の結果を返す場合と同じ同期を確認できますか?

ピーター・ドゥニホ

非同期メソッドのタスク結果を実行せずにキューに入れるにはどうすればよいですか?

簡単な答え:できません。asyncメソッドを呼び出すと、そのメソッドが実行されます。必然的実行開始します。通話を延期できるようにしたい場合は、それを行う何かで通話をラップする必要があります。

一例としてFunc<Task<T>>、あなたが私たちと共有するように設計したほんの少しのコードがTask<T>、将来行うこの呼び出しを表すpromise()も返すことができるようにすることを示唆している場合を除きます。サンプルコードのように、すべてを別のタスクでラップすることもできますが、IMHOは、asyncメソッドを呼び出すためだけにスレッドプールスレッドを拘束する(そして場合によっては新しいものを作成する)ため、かなり手間のかかるアプローチです。

それを達成するためのより良い方法(IMHO)は、を使用することTaskCompletionSource<T>です。Func<Task>キューに格納できます。キューは戻り値を使用してを設定しTaskCompletionSource<T>、タスクを開始できると判断したら、を呼び出しますFunc<Task>

何かのようなもの:

public Task<T> ExecuteAsync<T>(T transaction) {
    if (mustDelay) {
        TaskCompletionSource<T> tcs = new TaskCompletionSource<T>();

        enqueue(async () =>
        {
            tcs.SetValue(await executeAsync(transaction));
        });
        return tcs.Task;
    }
    return executeAsync(transaction);
}

ここで、は必要ありませんことに注意ExecuteAsync<T>()する必要がasyncTaskCompletionSource<T>'タスクを返すかexecuteAsync<T>()メソッドによって返されたタスクを返します(ちなみに、名前が大文字と小文字だけが異なる2つのメソッドを持つことは、私見では恐ろしい考えです)。

また、キューにはFunc<Task>オブジェクト、またはオブジェクトが格納されることにも注意してくださいAction(通常async void、上記の匿名メソッドなどのメソッドでは嫌われますが、そもそも例外処理を表示しなかったため、次の場所で正常に機能することがわかります。この場合)。アイテムをデキューすると、そのデリゲートが呼び出されます。必要に応じて、これは「ファイアアンドフォーゲット」(Actionデリゲートを格納する場合)になるか、デリゲートをデキューして呼び出すメソッドがデリゲートの戻り値を待つ場合があります(Func<Task>デリゲートを格納する場合)。

残念ながら、あなたの質問はかなり曖昧です。したがって、これ以上のものを提供することはできません。さらにヘルプが必要な場合は、質問を改善して、達成しようとしていること、具体的に理解するのに問題があることを明確に示す、最小限、完全、検証可能な優れたコード例と、それを詳しく説明してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

現在の関数/スレッドで結果を待たずに非同期タスクを実行するにはどうすればよいですか?

分類Dev

実装するインターフェースが非同期の場合、「この非同期メソッドには「await」演算子がなく、同期的に実行されます」という警告を抑制するにはどうすればよいですか?

分類Dev

非同期Task <T>メソッドを同期的に実行するにはどうすればよいですか?

分類Dev

クラスのiterメソッドがforループを実行せずに値を返すようにするにはどうすればよいですか?

分類Dev

CS1998に警告せずに同期タスク戻りメソッドを実装するにはどうすればよいですか?

分類Dev

CS1998に警告せずに同期タスク戻りメソッドを実装するにはどうすればよいですか?

分類Dev

ネットワーク要求が非同期で実行されるのを待って、結果をメインスレッドで処理するにはどうすればよいですか?

分類Dev

非同期呼び出しを行うmeteorメソッドでコールバックを実行するにはどうすればよいですか?

分類Dev

クエリ結果をクラスにキャッシュし、C#のメソッドで渡されたパラメーターに基づいて検索するために再利用するにはどうすればよいですか?

分類Dev

公開された各メソッドの前に非同期タスクを実行できるjavascriptヘルパー関数/クラスを作成するにはどうすればよいですか?

分類Dev

ネストされた非同期メソッドを同期的に実行するにはどうすればよいですか?

分類Dev

ネストされた非同期メソッドを同期的に実行するにはどうすればよいですか?

分類Dev

async / awaitを使用してUIスレッドでいくつかのタスクを非同期に実行するにはどうすればよいですか?

分類Dev

非同期メソッドの結果が得られるまでプログラムを一時停止するにはどうすればよいですか?

分類Dev

キューとバックグラウンドで非同期コマンドを実行するにはどうすればよいですか?

分類Dev

MessagingCenter.Subscribeで実行されるメソッドを非同期メソッドにするにはどうすればよいですか?

分類Dev

非同期メソッドで無効な入力ケースをチェックするにはどうすればよいですか?

分類Dev

ディスパッチキューの非同期実行を迅速に終了するにはどうすればよいですか?

分類Dev

変換を使用せずにssisでSQLタスクの実行からレコードを挿入、更新するにはどうすればよいですか?

分類Dev

TestNGから@beforeメソッドを実行せずに同じテストケースを実行するにはどうすればよいですか?

分類Dev

Web非同期からデータを受信し、コードの次の行で結果文字列を使用するにはどうすればよいですか?

分類Dev

生のSQLクエリを実行せずにActiverecordにデータベースドメインを追加するにはどうすればよいですか?

分類Dev

データを列挙せずに非同期クエリを実行するにはどうすればよいですか?

分類Dev

Task.Resultなしでawaitを介して非同期メソッドから正確に結果を取得するにはどうすればよいですか?

分類Dev

フォアグラウンドサービスで複数のタスクをキューに入れて、それらが1つずつ実行されるようにするにはどうすればよいですか?

分類Dev

非同期タスクを待機し、同じメソッドでモーダルフォームを表示するにはどうすればよいですか?

分類Dev

このメソッドを非同期にするにはどうすればよいですか?

分類Dev

メソッドの結果を1行で変更するにはどうすればよいですか?

分類Dev

N個のタスク(またはスレッド)を起動して、役に立たない結果を返す可能性のある同じメソッドを実行するにはどうすればよいですか?

Related 関連記事

  1. 1

    現在の関数/スレッドで結果を待たずに非同期タスクを実行するにはどうすればよいですか?

  2. 2

    実装するインターフェースが非同期の場合、「この非同期メソッドには「await」演算子がなく、同期的に実行されます」という警告を抑制するにはどうすればよいですか?

  3. 3

    非同期Task <T>メソッドを同期的に実行するにはどうすればよいですか?

  4. 4

    クラスのiterメソッドがforループを実行せずに値を返すようにするにはどうすればよいですか?

  5. 5

    CS1998に警告せずに同期タスク戻りメソッドを実装するにはどうすればよいですか?

  6. 6

    CS1998に警告せずに同期タスク戻りメソッドを実装するにはどうすればよいですか?

  7. 7

    ネットワーク要求が非同期で実行されるのを待って、結果をメインスレッドで処理するにはどうすればよいですか?

  8. 8

    非同期呼び出しを行うmeteorメソッドでコールバックを実行するにはどうすればよいですか?

  9. 9

    クエリ結果をクラスにキャッシュし、C#のメソッドで渡されたパラメーターに基づいて検索するために再利用するにはどうすればよいですか?

  10. 10

    公開された各メソッドの前に非同期タスクを実行できるjavascriptヘルパー関数/クラスを作成するにはどうすればよいですか?

  11. 11

    ネストされた非同期メソッドを同期的に実行するにはどうすればよいですか?

  12. 12

    ネストされた非同期メソッドを同期的に実行するにはどうすればよいですか?

  13. 13

    async / awaitを使用してUIスレッドでいくつかのタスクを非同期に実行するにはどうすればよいですか?

  14. 14

    非同期メソッドの結果が得られるまでプログラムを一時停止するにはどうすればよいですか?

  15. 15

    キューとバックグラウンドで非同期コマンドを実行するにはどうすればよいですか?

  16. 16

    MessagingCenter.Subscribeで実行されるメソッドを非同期メソッドにするにはどうすればよいですか?

  17. 17

    非同期メソッドで無効な入力ケースをチェックするにはどうすればよいですか?

  18. 18

    ディスパッチキューの非同期実行を迅速に終了するにはどうすればよいですか?

  19. 19

    変換を使用せずにssisでSQLタスクの実行からレコードを挿入、更新するにはどうすればよいですか?

  20. 20

    TestNGから@beforeメソッドを実行せずに同じテストケースを実行するにはどうすればよいですか?

  21. 21

    Web非同期からデータを受信し、コードの次の行で結果文字列を使用するにはどうすればよいですか?

  22. 22

    生のSQLクエリを実行せずにActiverecordにデータベースドメインを追加するにはどうすればよいですか?

  23. 23

    データを列挙せずに非同期クエリを実行するにはどうすればよいですか?

  24. 24

    Task.Resultなしでawaitを介して非同期メソッドから正確に結果を取得するにはどうすればよいですか?

  25. 25

    フォアグラウンドサービスで複数のタスクをキューに入れて、それらが1つずつ実行されるようにするにはどうすればよいですか?

  26. 26

    非同期タスクを待機し、同じメソッドでモーダルフォームを表示するにはどうすればよいですか?

  27. 27

    このメソッドを非同期にするにはどうすればよいですか?

  28. 28

    メソッドの結果を1行で変更するにはどうすればよいですか?

  29. 29

    N個のタスク(またはスレッド)を起動して、役に立たない結果を返す可能性のある同じメソッドを実行するにはどうすればよいですか?

ホットタグ

アーカイブ