Я работаю с библиотекой, для которой у меня нет источника, и поэтому я не могу украсить ее ключевым словом async и делать такие вещи, как await
Task
(по крайней мере, я не знаю, как это сделать). Он предоставляет метод, который возвращает объект (я назову его "ответ") и принимает целое число и параметр типа " Action
где я получаю этот ответ. Как я могу ждать ответа, чтобы заполнить его до моего кода?
Object answer = null;
remoteLibrary.remoteMethod(42, x =>
{
answer = x.Value; //This might take a few seconds
});
//I want to do something here with "answer" AFTER it has been populated
Вам нужна конструкция синхронизации. И так как это может занять несколько секунд, было бы бесполезным использовать синхронный (блокирующий), поэтому я предлагаю асинхронный, например TaskCompletionSource
:
var tcs = new TaskCompletionSource<object>();
remoteLibrary.remoteMethod(42, x =>
{
tcs.SetResult(x.Value);
});
var answer = await tcs.Task;
// use answer
TaskCompletionSource
предоставляет задачу, которую вы можете await
, которая не будет завершена, пока вы не SetResult
(или SetCanceled
, SetException
). Когда он завершится, вы получите результат, который вы установите в SetResult
чтобы вам больше не нужна фиктивная переменная.