非同期C#Tasks.WhenAny

ミシャ長老

タスクとタイマーを実行する必要があります。タイマーが早く終了した場合は、別のタスクを実行し、最初と2番目のタスクの両方からの応答を待ち続け、最初に完了した結果を返します。そして、タイマーを再起動する必要があります。私はそのようなことをすると思います

foreach (var uri in Addresses)
{
    var webRequest = CreateRequest(uri + "?query=" + query);            
    resultTasks.Add(ProcessRequestAsync(webRequest));
}
Task<string> firstFinishedTask = await Task.WhenAny(resultTasks);



<-- if timer end early -->
resultTasks.Add(<--newTask-->);
Task<string> firstFinishedTask = await Task.WhenAny(resultTasks);

しかし、リストにはすでに実行中のタスクがあるため、この時点でエラーが発生します。

あなたは何をお勧めできますか?

言い換えれば:私はタスクのリストを持っています

List<Task> tasksList = new List<Task>();
<-- some initialization of this list-->

次にTask.WhenAny(tasksList);、WhenAnyに別のタスクを追加する方法を開始します。

Gabor

私はあなたのための可能な解決策を見つけたと思います。しかし、Timer私が使用する代わりにTask.Delay(...)

ここに含まれているサンプル・リサイズ・アプリケーションのコードでありButton btnStartProgressBar progressBarそしてRichTextBox logその主なフォームには

CreateNextTask()Task必要に応じて新しいものを作成します。

GetWaitTask() タイマーの役割を果たします。

それは機能しているようでした。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TaskAndTimer
{
    public partial class MainForm : Form
    {
        private int[] taskConfigs = { 1200, 1300, 1100, 800 };
        private Queue<int> queue;

        public MainForm()
        {
            InitializeComponent();
        }

        private async void btnStart_Click(object sender, EventArgs e)
        {
            queue = new Queue<int>(taskConfigs);

            Task<int> firstTask;
            Task<int>[] tasks = new Task<int>[] { };
            int result = -1;

            progressBar.Style = ProgressBarStyle.Marquee;

            do
            {
                log.AppendText($"Next round...{Environment.NewLine}");
                log.AppendText($"-------------{Environment.NewLine}");

                tasks =
                    tasks
                        .Concat(new[] { GetWaitTask(), CreateNextTask() })
                        .ToArray();

                LogTasks("Current tasks:", tasks);

                firstTask = await Task.WhenAny(tasks);

                LogTasks("First task:", firstTask);

                tasks = tasks.Except(new[] { firstTask }).ToArray();

                LogTasks("Remaining tasks:", tasks);

                result = await firstTask;

                log.AppendText($"-------------{Environment.NewLine}");
                log.AppendText(Environment.NewLine);
            }
            while (result == -1 && queue.Any());

            log.AppendText($"result = [{result}]\r\n");

            progressBar.Style = ProgressBarStyle.Blocks;
        }

        private Task<int> GetWaitTask()
        {
            return Task.Run(async () => { await Task.Delay(1000); return -1; });
        }

        private Task<int> CreateNextTask()
        {
            if (queue.Any())
            {
                int data = queue.Dequeue();
                return Task.Run(async () => { await Task.Delay(data); return data; });
            }

            return Task.FromResult(-1);
        }

        private void LogTasks(string message, params Task<int>[] tasks)
        {
            log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
            log.AppendText($"> {message}");

            foreach (var task in tasks)
            {
                log.AppendText($" [{task.Id}];");
            }

            log.AppendText(Environment.NewLine);
        }
    }
}

そして結果はこれでした:

Next round...
-------------
2018-02-23 19:30:31.2273143> Current tasks: [2]; [4];
2018-02-23 19:30:32.2300773> First task: [2];
2018-02-23 19:30:32.2330774> Remaining tasks: [4];
-------------

Next round...
-------------
2018-02-23 19:30:32.2375774> Current tasks: [4]; [14]; [16];
2018-02-23 19:30:32.4392640> First task: [4];
2018-02-23 19:30:32.4452575> Remaining tasks: [14]; [16];
-------------

result = [1200]

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Task.WhenAnyを使用していくつかの異なる非同期操作の結果を待ちます

分類Dev

How to get effect of Task.WhenAny for a Task and CancellationToken?

分類Dev

ReactiveUIとWhenAnyでのキャスト

分類Dev

ReactiveUIとWhenAnyでのキャスト

分類Dev

How to yield return item when doing Task.WhenAny

分類Dev

現在のnull値の場合はWhenAny

分類Dev

エラーF#-c#非同期呼び出し:Threading.Tasks.Task <MyType>を非同期<'a>に変換しています

分類Dev

Task.WhenAny ContinueWith:引数を取得しますか?

分類Dev

辞書を使用したTask.WhenAnyの使用

分類Dev

Task.WhenAny for a Task and CancellationTokenの効果を得る方法は?

分類Dev

await Task.WhenAny()を使用して例外を無視する

分類Dev

Task.WhenAny(障害のないタスクの場合)

分類Dev

Task.WhenAny-タスクがキャンセルされました

分類Dev

WhenAnyを使用して、タスクごとに例外を処理する

分類Dev

C#非同期選択

分類Dev

非同期C ++ソケット

分類Dev

Powershell C#非同期実行

分類Dev

非同期TCP接続C#

分類Dev

非同期圧縮c#

分類Dev

C#非同期MVCメソッドはContentResult System.Threading.Tasks.Task`1 [System.Web.Mvc.JsonResult]を返します

分類Dev

非同期C#での同期実行

分類Dev

EDT、非同期、同期

分類Dev

C ++非同期関数が非同期で起動されない

分類Dev

Task.WhenAny-実行中の残りのタスクはどうなりますか?

分類Dev

Task.WhenAny-実行中の残りのタスクはどうなりますか?

分類Dev

Task.WhenAnyは、いくつかのタスクを他のタスクよりも優先しますか?

分類Dev

Task.WhenAny未完了のタスクのキャンセルとタイムアウト

分類Dev

1つの特定のタスクが終了したときにTask.WhenAnyが戻るようにします

分類Dev

結果がすぐに使用されている場合、WhenAny vs WhenAll vs WaitAll vs none

Related 関連記事

  1. 1

    Task.WhenAnyを使用していくつかの異なる非同期操作の結果を待ちます

  2. 2

    How to get effect of Task.WhenAny for a Task and CancellationToken?

  3. 3

    ReactiveUIとWhenAnyでのキャスト

  4. 4

    ReactiveUIとWhenAnyでのキャスト

  5. 5

    How to yield return item when doing Task.WhenAny

  6. 6

    現在のnull値の場合はWhenAny

  7. 7

    エラーF#-c#非同期呼び出し:Threading.Tasks.Task <MyType>を非同期<'a>に変換しています

  8. 8

    Task.WhenAny ContinueWith:引数を取得しますか?

  9. 9

    辞書を使用したTask.WhenAnyの使用

  10. 10

    Task.WhenAny for a Task and CancellationTokenの効果を得る方法は?

  11. 11

    await Task.WhenAny()を使用して例外を無視する

  12. 12

    Task.WhenAny(障害のないタスクの場合)

  13. 13

    Task.WhenAny-タスクがキャンセルされました

  14. 14

    WhenAnyを使用して、タスクごとに例外を処理する

  15. 15

    C#非同期選択

  16. 16

    非同期C ++ソケット

  17. 17

    Powershell C#非同期実行

  18. 18

    非同期TCP接続C#

  19. 19

    非同期圧縮c#

  20. 20

    C#非同期MVCメソッドはContentResult System.Threading.Tasks.Task`1 [System.Web.Mvc.JsonResult]を返します

  21. 21

    非同期C#での同期実行

  22. 22

    EDT、非同期、同期

  23. 23

    C ++非同期関数が非同期で起動されない

  24. 24

    Task.WhenAny-実行中の残りのタスクはどうなりますか?

  25. 25

    Task.WhenAny-実行中の残りのタスクはどうなりますか?

  26. 26

    Task.WhenAnyは、いくつかのタスクを他のタスクよりも優先しますか?

  27. 27

    Task.WhenAny未完了のタスクのキャンセルとタイムアウト

  28. 28

    1つの特定のタスクが終了したときにTask.WhenAnyが戻るようにします

  29. 29

    結果がすぐに使用されている場合、WhenAny vs WhenAll vs WaitAll vs none

ホットタグ

アーカイブ