任务的同步

本文关键字:同步 任务 | 更新日期: 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;
}