任务同步

时间:2015-11-30 06:45:44

标签: c# task

我希望仅在收到回调时完成一项任务时同步任务。

让我解释一下我的情景。

在一个函数中,我有多个任务,每个后续任务只会在成功完成前一个任务后运行。这可以使用function check_value_in_database($s) { return ($s== "pizzapie");& ContinueWith。我只想知道当一个任务的结果进入回调并且回调是一般回调时,如何同步两个或多个任务。我无法在回调中创建我的后续任务。

TaskContinuationOptions.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; } 的循环中逐个向ZWDevice发出一些命令。这些命令的响应将在回调中返回(其定义不在我的控制之内,因为它是由某些第三方框架定义的)。在回调中,我正在检查此响应来自哪个命令的字节值并相应地工作。这意味着如果在ThirdTaskFunction我正在发出3个命令,那么我将在ThirdTaskFunction中获得3个回调。
现在我只想在收到所有回调时运行FourthTask。但我发现在收到所有回调之前我的FourthTask正在执行。

所以我想同步这个。我无法在callback本身运行我的FourthTask,因为它是一个通用的回调函数,在其他场景中也会被调用,也就是说,当我向ZWdevice发出一些关于用户操作的命令时。

有没有办法实现这个? 希望现在我很清楚。

1 个答案:

答案 0 :(得分:0)

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;
}