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

时间:2019-04-02 15:20:00

标签: c# unity3d async-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
}

有人可以帮助我吗? 我正在团结一致

3 个答案:

答案 0 :(得分:1)

只有当您不想等待它并且“不在乎”结果时,您才这样做 您可以将其设置为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
    }

(请参阅this good tutorial

答案 1 :(得分:1)

正如Marc所说,“如何从同步方法中调用异步方法”的唯一正确答案是“您不知道”。

  

但是似乎未调用异步函数。

它肯定会被调用,但是由于它不在主UI线程上,因此可能无法正常工作。 Task.Run正在线程池线程上执行它。另外,我怀疑task中的var task = Task.Run(async () => await TakePhotoBasicAndSaveAndDisplayUWP());从未被等待,因此TakePhotoBasicAndSaveAndDisplayUWP中的任何异常都将被忽略。也就是说,一些异常表明必须从主UI线程而不是线程池线程中调用某些API。

  

我在TakePhotoBasicAndSaveAndDisplay上按下了一个按钮

如果TakePhotoBasicAndSaveAndDisplay实际上是an event handler, then you can use async void

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

答案 2 :(得分:-2)

您总是可以在末尾使用.Wait()调用异步方法。

myAsyncfuntion.Wait();

这有点毁了整个异步的事情。该方法将同步阻止,直到任务完成。

您可以检查此response以获得更多详细信息。