Вызов метода, который принимает параметр Action синхронно

1

Я работаю с библиотекой, для которой у меня нет источника, и поэтому я не могу украсить ее ключевым словом 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
Теги:
async-await
asynchronous
task

1 ответ

2
Лучший ответ

Вам нужна конструкция синхронизации. И так как это может занять несколько секунд, было бы бесполезным использовать синхронный (блокирующий), поэтому я предлагаю асинхронный, например 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 чтобы вам больше не нужна фиктивная переменная.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню