任务的同步
本文关键字:同步 任务 | 更新日期: 2023-09-27 18:25:10
我想在一个任务完成时同步任务,只在收到其回调时同步。
让我解释一下我的情景。
在一个函数中,我有多个任务,每个后续任务只有在成功完成前一个任务后才会运行。这可以使用CCD_ 1&CCD_ 2。我只想知道,当一个任务的结果将在回调中出现,而该回调是常规回调时,我如何同步两个或多个任务。我无法在回调中创建后续任务。
int SomeFunction()
{
Task<FirstTaskReturn> FirstTask = new Task<FirstTaskReturn>(() => FirstTaskFunction)
FirstTask.Start();
Task<SecondTaskReturn> SecondTask = FirstTask.ContinueWith(task => SecondTaskFunction(FirstTask.Result),TaskContinuationOptions.OnlyOnRanToCompletion);
Task<ThirdTaskResult> ThirdTask = SecondTask.ContinueWith(task => ThirdTaskFunction(SecondTask.Result),TaskContinuationOptions.OnlyOnRanToCompletion);
Task FourthTask = ThirdTask.ContinueWith(task => FourthTaskFunction(ThirdTask.Result),TaskContinuationOptions.OnlyOnRanToCompletion);
}
ThirdTaskResult ThirdTaskFunction(SecondTaskResult x)
{
//Here I am firing some commands to a ZWave device one by one in loop
}
void callback(byte response)
{
switch(response)
{
case 1:
//do some work for case 1
break;
case 2:
//do some work for case 2
break;
case 3:
//do some work for case 3
break;
case 4:
//do some work for case 4
break;
case 5:
//do some work for case 5
break;
}
现在,我在ThirdTaskFunction
中的循环中向ZWDevice逐个发出一些命令。这些命令的响应将在回调中返回(回调的定义不在我的控制范围内,因为它是由一些第三方框架定义的)。在回调中,我正在检查这个响应所针对的命令的字节值,并相应地工作。这意味着,如果在ThirdTaskFunction
中我发出3个命令,那么我将在callback
中得到3个回调
现在,我只想在收到所有回调时运行FourthTask。但我发现我的第四个任务在收到所有回调之前就已经执行了。
所以我想同步这个。我不能在callback
中运行我的FourthTask,因为它是一个通用回调,在其他情况下也会调用,也就是说,当我在用户操作时向ZWdevice发出一些命令时。
有什么办法可以做到这一点吗??希望现在我已经清楚了。
async Task<int> SomeFunction()
{
var result1 = await FirstTaskFunction();
var result2 = await SecondTaskFunction(result1);
var result3 = await ThirdTask(result2);
...ad nausum..
}
async Task<> ThirdTaskFunction(SecondTaskResult x)
{
foreach(var device in devices)
{
await DoStuffToZWave(device);
}
}
public Task<T> DoStuffToZWave(device) //NOTICE LACK OF ASYNC
{
var tcs = new TaskCompletionSource<T>()
//Do stuff
foo.callback += (o, e) => tcs.SetResult(theResult);
return tcs.Task;
}