【问题标题】:Win8 C# trouble with async/awaitWin8 C# 异步/等待问题
【发布时间】:2012-09-26 11:10:01
【问题描述】:

为什么第二种情况会抛出异常?

async void f() {
    await media.InitializeAsync();
    isInit = true;
    capturePreview.Source = media;
    await media.StartPreviewAsync(); // Ok
}

// ------------------------------------------

void f() {
    StaticClass.g(capturePreview.Source);
}

public static class StaticClass {
    public static async void g(MediaSource source) {
        await media.InitializeAsync();
        isInit = true;
        source = media;
        await media.StartPreviewAsync(); // Unknown Exception (It's seems that media isn't init)
    }
}

【问题讨论】:

  • 您能否在此处也包含您的源代码(链接会随着时间的推移而消失,但如果您添加您的代码,它将继续存在,以供后代敬畏)。
  • 您是否在主 UI 线程上运行这些方法?
  • 嗯..是的..我从 MainPage.xaml.cs 中的受保护覆盖​​ void OnNavigatedTo(NavigationEventArgs e) 运行它们

标签: c# windows-8 microsoft-metro c#-5.0


【解决方案1】:

f() 函数使用包含async 的函数。 所以我认为f() 也应该签名async。 像这样:void async f(){...}

【讨论】:

    【解决方案2】:

    如果你真的想要初始化媒体,为什么不在 .done 函数中完成其余的代码呢?

     void f() {
         StaticClass.g(capturePreview.Source);
        }
    
      public static class StaticClass {
         public static async void g(MediaSource source) {
           media.InitializeAsync().done(
           isInit = true;
           source = media;
           await media.StartPreviewAsync(););
         }
      }
    

    即使我不完全确定您是否可以在完成回调中执行异步操作。

    【讨论】:

    • 抱歉,我在阅读文档时犯了一个错误。您是否尝试过留在同一个线程而不是在 media.InitializeAsync 之后返回 UI 线程。试试这个你的初始代码:await media.InitializeAsync().ConfigureAwait(false);或许能破案
    • 但是没有 ConfigureAwait (media - MediaCapture)
    • 你能做到吗:await media.InitializeAsync().ToTask().ConfigureAwait(false);
    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2018-12-09
    • 2021-05-24
    • 1970-01-01
    • 2022-10-25
    • 2019-03-27
    相关资源
    最近更新 更多