Я пишу API, который предоставит доступ к каналу pubnub, но мне нужно дождаться предоставления доступа и вернуть результат. Может кто-нибудь подсказать, как я могу дождаться ответа, пожалуйста?
The return type of
.Asyncis void
Метод, который я вызываю для предоставления доступа, выглядит следующим образом:
pubnub.Grant()
.Channels(new string[] {
"channel"
})
.Read(true)
.Write(true)
.AuthKeys(new List<string>() { "xyz" }.ToArray())
.TTL(0)
.Async(new PNAccessManagerGrantResultExt((result, status) =>
{
//I need to await this and return the result in my method
}));
Since it does not return a task I cannot await it and my return statement would execute before this even completes.
Любые советы будут высоко ценится.





Мне прислали следующее решение от службы поддержки PubNub, которое решает эту проблему, см. ниже
var resultTask = new TaskCompletionSource<PNAccessManagerGrantResult>();
pubnub.Grant()
.Channels(new string[] {
"channel"
})
.Read(true)
.Write(true)
.AuthKeys(new List<string>() { "xyz" }.ToArray())
.TTL(0)
.Async(new PNAccessManagerGrantResultExt((result, status) =>
{
resultTask.TrySetResult(result);
}));
var syncResult = resultTask.Task.Result;
Но вы ничего не можете сделать, пока не будет предоставлен грант, поэтому вы не можете сделать это асинхронно. Но мой вопрос будет таким: «Вы предоставляете разрешения своему серверу или клиентскому приложению?» Дайте мне знать, потому что у меня есть разные советы, соответственно.
@CraigConover Точно, мне нужно знать результат. Я предоставляю клиентскому приложению короткий TTL.
Вы должны быть в состоянии выполнить асинхронный грант, и к тому времени, когда клиентское приложение получит ключ авторизации, он должен быть правильно распространен во всех наших точках присутствия, но есть вероятность, что он будет 403 по запросу от клиента из-за этого не полностью распространяется до того, как будет сделан этот запрос. Хорошей новостью является то, что у нас есть новая версия auth (Access Manager), которая на данный момент не является GA, и в ней нет этой проблемы. (продолжение в следующем комментарии)
Обходной путь — приостановить 1 с на стороне клиента перед выполнением запроса. Это нежелательный обходной путь, но лучше, чем повторная попытка 403 от клиента, потому что 403 будет кэшироваться в течение 5 секунд. У меня будет технический обзор, если есть варианты получше. Но auth v3 здесь является окончательным решением.
var syncResult = resultTask.Task.Result;Эта строка сводит на нет все преимущества использования методаasync. Узнайте, почему здесь: msdn.microsoft.com/en-us/magazine/jj991977.aspx — особенно раздел под названием Асинхронно на всем пути.