Как вызвать асинхронную функцию с ожиданием внутри не асинхронной функции в C #? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть асинхронный вызов функции myAsyncfuntion (), который выглядит так

public async Task TakePhotoBasicAndSaveAndDisplayUWP()
{
    var photoImplementation = new MediaCaptureImplementation();
    photoImplementation.TakePhotoTexture2DAsync();
    // Some code here...

    await photoImplementation.SavePhotoToPicturesLibraryAsync();
}

Теперь я хотел бы вызвать эту функцию из другой не асинхронной функции, поэтому я делаю вот так.В основном я прикрепляю кнопку к TakePhotoBasicAndSaveAndDisplay () и всякий раз, когда нажимается кнопка, функция запускает асинхронную функцию внутри.Но кажется, что асинхронная функция не вызывается.

public void TakePhotoBasicAndSaveAndDisplay()
{
   #if WINDOWS_UWP
    var task = Task.Run(async () => await TakePhotoBasicAndSaveAndDisplayUWP());
   #endif
}

Может ли кто-нибудь мне помочь?Я работаю с единством

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Как прокомментировал Марк, единственный правильный ответ на вопрос «как вызвать асинхронный метод из синхронного метода» - «вы этого не делаете».

Но асинхронная функция, похоже, неПозвонил.

Это, конечно, вызывается, но возможно, что он может работать неправильно, потому что он не в основном потоке пользовательского интерфейса.Task.Run выполняет его в потоке пула потоков.Кроме того, я подозреваю, что task в var task = Task.Run(async () => await TakePhotoBasicAndSaveAndDisplayUWP()); никогда не ожидается, поэтому любые исключения из TakePhotoBasicAndSaveAndDisplayUWP будут игнорироваться.То есть исключения, утверждающие, что некоторый API должен вызываться из основного потока пользовательского интерфейса, а не из потока пула потоков.

Я прикрепил кнопку к TakePhotoBasicAndSaveAndDisplay

Если TakePhotoBasicAndSaveAndDisplay на самом деле обработчик событий, тогда вы можете использовать async void:

public async void TakePhotoBasicAndSaveAndDisplay()
{
  #if WINDOWS_UWP
  await TakePhotoBasicAndSaveAndDisplayUWP();
  #endif
}
1 голос
/ 02 апреля 2019

Вы делаете это , только если вы не хотите его ждать и «не заботитесь» о результате вы можете сделать это async void

public async void TakePhotoBasicAndSaveAndDisplayUWP()
{
    var photoImplementation = new MediaCaptureImplementation();
    photoImplementation.TakePhotoTexture2DAsync();
    // Some code here...

    await photoImplementation.SavePhotoToPicturesLibraryAsync();
}

, чем вы можете назвать это как

    public void TakePhotoBasicAndSaveAndDisplay()
    {
#if WINDOWS_UWP
       TakePhotoBasicAndSaveAndDisplayUWP();
#endif
    }

(см. это хорошее руководство )

0 голосов
/ 02 апреля 2019

Вы всегда можете вызвать асинхронный метод с .Wait () в конце.

myAsyncfuntion.Wait();

Это как бы разрушает всю асинхронность. Метод будет блокироваться синхронно, пока задача не будет завершена.

Вы можете проверить этот ответ для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...