Обратный вызов Promisify / async-await в c # - PullRequest
0 голосов
/ 15 октября 2018

У меня есть функция ac # с такой подписью: Foo(List<int> data, Action<string> endAction)

Я не могу изменить Foo (это внешняя библиотека).

Я очень новичок в c #, я в основном занимался разработкой JS в последние годы, и мне интересно, есть ли что-то похожее на то, что называется 'promisify' в JS-land.То есть, чтобы сделать функцию, вызывающую 'Foo', асинхронной и ждать, пока Foo вызовет обратный вызов endAction.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете сделать 'обещание' Foo следующим образом:

static Task<string> FooAsync(List<int> data)
{
    var tcs = new TaskCompletionSource<string>();
    Action action = () => Foo(data, result => tcs.SetResult(result));
    // If Foo isn't blocking, we can execute it in the ThreadPool:
    Task.Run(action);
    // If it is blocking for some time, it is better to create a dedicated thread
    // and avoid starving the ThreadPool. Instead of 'Task.Run' use:
    // Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);
    return tcs.Task;
}

Теперь вы можете назвать его:

string result = await FooAsync(myList);
0 голосов
/ 16 октября 2018

В C # /. NET нет встроенного метода, аналогичного promisify, но вы можете использовать экземпляр TaskCompletionSource для создания Task, который может быть завершен при вызове обратного вызова.

TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
Foo(list, (string callbackData) => { tcs.SetResult(callbackData); });
string result = await tcs.Task;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...