Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在某些条件下等待所有任务_C#_Multithreading_Asynchronous_Task - Fatal编程技术网

C# 在某些条件下等待所有任务

C# 在某些条件下等待所有任务,c#,multithreading,asynchronous,task,C#,Multithreading,Asynchronous,Task,我正在写一些复杂的任务,我无法成功地解决这个问题 private static void RunTasks() { TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); Task<bool> t0 = Task.Factory.StartNew<bool>(() => Find(1, 2)); Task<bool> t1 = T

我正在写一些复杂的任务,我无法成功地解决这个问题

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;
}
  • 我打开了一些用于异步搜索某些数据的任务
  • 最后,我等待所有的任务
  • 我希望在所有数据上运行,并且在任务全部完成之前不会停止任务。 但是,当其中一个任务找到一些相关数据时,我希望继续使用等待所有任务之后的代码,但同时,我希望继续搜索我的任务(直到读取所有数据)
  • 我找到了一种方法,可以在等待之后继续代码。如果其中一个任务找到了数据,问题是它也会停止所有任务的运行

    这是我的代码(这只是演示问题的代码)

    private static void RunTasks()
    {
    TaskCompletionSource tcs=新的TaskCompletionSource();
    taskt0=Task.Factory.StartNew(()=>Find(1,2));
    taskt1=Task.Factory.StartNew(()=>Find(4,7));
    taskt2=Task.Factory.StartNew(()=>Find(13,14));
    t0.继续使用(=>
    {
    如果(t0.结果)
    tcs.TrySetResult(t0.Result);
    });
    t1.继续使用(=>
    {
    如果(t1.结果)
    tcs.TrySetResult(t1.Result);
    });
    t2.继续使用(=>
    {
    如果(t2.结果)
    tcs.TrySetResult(t2.Result);
    });
    Task.Wait();
    控制台。写入线(“找到”);
    ContinueWork();//在找到至少一个数据后或在所有任务完成后运行。
    }
    //只是为了示范。。。
    专用静态布尔查找(整数a、整数b)
    {
    控制台写入线(“a:+a+”b:+b);
    返回a==4&&b==7?真:假;
    }
    
    我如何编写它,以便在找到某些数据时,它将继续使用作业方法,并继续使用任务读取数据


    谢谢。

    这不是最干净的方式,但可以满足您的目的:

                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();
    
    TaskCompletionSource tcs=new TaskCompletionSource();
    任务[]任务=新任务[3];
    tasks[0]=Task.Factory.StartNew(()=>Find(1,2));
    tasks[1]=Task.Factory.StartNew(()=>Find(4,7));
    tasks[2]=Task.Factory.StartNew(()=>Find(13,14));
    任务[0]。继续使用(\u0=>
    {
    如果(任务[0]。结果)
    tcs.TrySetResult(任务[0].Result);
    });
    任务[1]。继续使用(\u0=>
    {
    如果(任务[1]。结果)
    TrySetResult(任务[1]。结果);
    });
    任务[2]。继续使用(\u0=>
    {
    如果(任务[2]。结果)
    TrySetResult(任务[2]。结果);
    });
    Task.WaitAny(任务);
    控制台。写入线(“找到”);
    继续工作();
    
    不确定问题出在哪里。你说这段代码在你设置结果后立即停止执行任务?我无法重现这个问题。它执行所有这三项任务。我遗漏了什么吗?如果我理解正确,您可能需要用这3个任务创建一个任务数组,然后调用Task.when传递数组。@SriramSakthivel当我找到一个结果时,任务停止。但我不想要它。@terrybozzio我考虑过Whany,但问题是Whany会在发现返回真值时停止所有任务。还是我错了?它会在“那个点”等待第一个结果,然后从那个点继续,任务会一直进行到最后。