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会在发现返回真值时停止所有任务。还是我错了?它会在“那个点”等待第一个结果,然后从那个点继续,任务会一直进行到最后。