繁体   English   中英

任务同步

[英]Synchronization of Tasks

我想仅在收到一个任务的回调后才同步一个任务。

让我解释一下我的情况。

在一个函数中,我有多个任务,每个后续任务仅在成功完成前一个任务后才会运行。 这可以使用ContinueWithTaskContinuationOptions.OnlyOnRanToCompletion实现。 我只想知道当一个任务的结果出现在回调中并且该回调是常规回调时,如何同步两个或多个任务。 我无法在回调中创建我的后续任务。

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个callback
现在,我只想在收到所有回调后运行FourthTask。 但是我发现在收到所有回调之前,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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM