преобразовать/обернуть классический асинхронный метод, использующий обратный вызов

Я пытаюсь преобразовать «классический» асинхронный метод, использующий обратный вызов, в метод async/await.

Это код:

authClient.LoginCompleted += authClient_LoginCompleted;
authClient.LoginAsync(new List<string>() { "var1", "var2" }, data);

static void authClient_LoginCompleted(object sender, LoginCompletedEventArgs e)
{ ... }

Где «data» — это UserState, а authClient_LoginCompleted — обратный вызов.

У меня уже есть логика для методов async/await, проблема в том, что взаимодействие в Windows Phone с Microsoft.Live использует обратные вызовы. Я рассматриваю решение с использованием семафора, чтобы не менять логику, которая у меня есть. Это может быть хорошим вариантом?


person user1845148    schedule 22.11.2012    source источник


Ответы (1)


Если вам нужно обернуть асинхронные обратные вызовы в Task, вы можете использовать TaskCompletionSource<T>. MSDN содержит полную информацию.

Однако в вашем случае вы можете просто использовать LoginAsync без параметра UserState:

LiveLoginResult result = await authClient.LoginAsync(new[] { "var1", "var2" });
person Stephen Cleary    schedule 22.11.2012
comment
Эта ссылка очень полезна для понимания использования TaskCompletionSource: blog.galasoft.ch/archive/2013 /27/01/ - person user1845148; 28.01.2013