如何在 C# 中的非异步函数中使用 await 调用异步函数?

我有一个异步函数调用 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

}

谁能帮帮我?我正在团结一致


宝慕林4294392
浏览 92回答 3
3回答

慕容708150

正如 Marc 评论的那样,“我如何从同步方法调用异步方法”的唯一正确答案是“你不这样做”。但是异步函数似乎没有被调用。它肯定会被调用,但它可能无法正常工作,因为它不在主 UI 线程上。Task.Run在线程池线程上执行它。此外,我怀疑永远不会等待taskin var task = Task.Run(async () => await TakePhotoBasicAndSaveAndDisplayUWP());,因此任何异常TakePhotoBasicAndSaveAndDisplayUWP都会被忽略。即,异常说明某些 API 必须从主 UI 线程而不是线程池线程调用。我点击一个按钮TakePhotoBasicAndSaveAndDisplay如果TakePhotoBasicAndSaveAndDisplay实际上是一个事件处理程序,那么您可以使用async void:public async void TakePhotoBasicAndSaveAndDisplay(){  #if WINDOWS_UWP  await TakePhotoBasicAndSaveAndDisplayUWP();  #endif}

米脂

只有当你不想等待它并且“不关心”你可以做到的结果时,你才这样做async voidpublic async void TakePhotoBasicAndSaveAndDisplayUWP(){    var photoImplementation = new MediaCaptureImplementation();    photoImplementation.TakePhotoTexture2DAsync();    // Some code here...    await photoImplementation.SavePhotoToPicturesLibraryAsync();}比你可以称之为    public void TakePhotoBasicAndSaveAndDisplay()    {#if WINDOWS_UWP       TakePhotoBasicAndSaveAndDisplayUWP();#endif    }

隔江千里

您始终可以在末尾调用带有 .Wait() 的异步方法。myAsyncfuntion.Wait();它有点毁了整个异步的东西。该方法将同步阻塞,直到任务完成。您可以查看此回复以了解更多详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP