Новый ответ:
public class App
{
TaskCompletionSource<int> _tcsSquare;
public async Task<int> First()
{
// I need wait for Second() to be called and get result from it to continue here.
var result = await _tcsSquare.Task;
return result;
}
// It is not gonna be called from First(), it is a callback from Web.
public async Task Second(int x)
{
await Task.Delay(2000);
_tcsSquare.SetResult(x * x);
}
public void Start()
{
_tcsSquare = new TaskCompletionSource<int>();
var result = Task.Run(() => First());
Task.Factory.StartNew(() => Second(5));
Console.WriteLine(result.Result);
}
}
Этот код запустит две задачи. Независимо друг от друга. TaskCompletionSource
- это предоставление задачи для синхронизации между двумя задачами. Как только second () устанавливает Result с оператором _tcsSquare.Result = ....
. Ожидание внутри First()
заканчивается.
Вам не нужно l oop или проверять снова каждые несколько секунд. Он может ждать, пока _tcsSquare получит результаты.
Подробнее здесь: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskcompletionsource-1?view=netframework-4.8
Первый ответ:
В асинхронном программировании это обычно для по завершении одна асинхронная операция для вызова второй операции и передачи ей данных.
платформа предлагает использовать функцию ContinueWith
.
Вам придется немного изменить свой заказ. Поскольку 2-я функция завершается первой, вы должны вызывать ее на самом деле как первую функцию. Вот как может выглядеть ваш код:
public class App
{
public async Task<int> Run(Func<int, int> callback)
{
// start second() as a Task.
var secondTask = Task.Run(() => callback(5));
// second() has completed
var result = await secondTask.ContinueWith(
output =>
{
//use output of second() here using output.Result
return output.Result * output.Result; // 625
});
return result;
}
public int second(int x)
{
return x * x;
}
public void Start()
{
var result = Run(second).Result;
Console.WriteLine(result);
}
}
Подробнее здесь: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.continuewith?view=netframework-4.8