簡體   English   中英

在某些條件下等待所有任務

[英]Wait all tasks with some conditions

我正在寫一些復雜的任務,但是我無法成功解決問題。

  1. 我打開一些任務以異步搜索一些數據。
  2. 最后,我等待所有任務。
  3. 我想對所有數據運行,並且直到它們全部完成后才停止任務。 但是,當其中一個任務找到一些相關數據時,我想繼續等待所有任務之后的代碼,但是同時,我想繼續搜索我的任務(直到將讀取所有數據) 。

在這里,我找到了一種方法,如果其中一個任務找到了數據,那么在全部等待之后如何繼續執行代碼,問題是它還會停止所有任務的運行。

這是我的代碼(這只是演示問題的代碼)。

private static void RunTasks()
{
    TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
    Task<bool> t0 = Task.Factory.StartNew<bool>(() => Find(1, 2));
    Task<bool> t1 = Task.Factory.StartNew<bool>(() => Find(4, 7));
    Task<bool> t2 = Task.Factory.StartNew<bool>(() => Find(13, 14));

    t0.ContinueWith(_ =>
    {
        if (t0.Result)
            tcs.TrySetResult(t0.Result);
    });

    t1.ContinueWith(_ =>
    {
        if (t1.Result)
            tcs.TrySetResult(t1.Result);
    });

    t2.ContinueWith(_ =>
    {
        if (t2.Result)
            tcs.TrySetResult(t2.Result);
    });

    tcs.Task.Wait();

    Console.WriteLine("Found");
    ContinueWork(); //Runs after at least one data found or when all tasks finish.
}

//Just for demonstration...
private static bool Find(int a, int b)
{
    Console.WriteLine("a: " + a + " b: " + b);
    return a == 4 && b == 7 ? true : false;
}

我該如何編寫它,以便在找到某些數據時將繼續使用ContinueWork方法,並且還將繼續通過任務讀取數據?

謝謝。

這不是最干凈的方法,但可以滿足您的目的:

            TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
            Task<bool>[] tasks = new Task<bool>[3];
            tasks[0] = Task.Factory.StartNew<bool>(() => Find(1, 2));
            tasks[1] = Task.Factory.StartNew<bool>(() => Find(4, 7));
            tasks[2] = Task.Factory.StartNew<bool>(() => Find(13, 14));

            tasks[0].ContinueWith(_ =>
            {
                if (tasks[0].Result)
                    tcs.TrySetResult(tasks[0].Result);
            });

            tasks[1].ContinueWith(_ =>
            {
                if (tasks[1].Result)
                    tcs.TrySetResult(tasks[1].Result);
            });

            tasks[2].ContinueWith(_ =>
            {
                if (tasks[2].Result)
                    tcs.TrySetResult(tasks[2].Result);
            });

            Task.WaitAny(tasks);

            Console.WriteLine("Found");
            ContinueWork();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM