我希望仅在收到回调时完成一项任务时同步任务。
让我解释一下我的情景。
在一个函数中,我有多个任务,每个后续任务只会在成功完成前一个任务后运行。这可以使用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发出一些关于用户操作的命令时。
有没有办法实现这个? 希望现在我很清楚。
答案 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;
}