窗口手机中的异步怎么办?

时间:2014-03-25 02:33:20

标签: c# windows-phone-8 async-await

  • 在app.xaml.cs

     private void Application_Closing(object sender, ClosingEventArgs e)
      {
        A.onEndApp();
      }
    
  • 在A班

    async public static void onEndApp()
      {
      string temp=await doSomething();
      //code here
     }
    

我遇到问题,当我关闭某个应用时,然后运行onEndApp()方法, 当doSomething()运行完成且{//code here}未运行时,但是如果我放入A.onEndApp() 它运行的另一种方法是正常运行,例如Application_Launching()方法,它将被运行 {//code here}

我认为当应用程序运行时没问题,但是当应用程序关闭时,运行等待完成然后停止,我想在异步关闭应用程序时运行完整方法。

2 个答案:

答案 0 :(得分:1)

执行Application_Closing(同步)后,操作系统将终止该过程。 可能在此之前是短暂的延迟,并且可能足以让您完成对隔离存储的写入,或者在这种情况下您可能 。最终会有腐败的状态

我只是直接引用" Beware the perils of async/await in application lifecycle event handlers (in fact in any event handlers)"在Andy Wigley的博客上。

  

从Application_Deactivated或Application_Closing

调用异步代码      

这里的指导是“不要'”。如果您仔细编写应用程序,可以随时保存对持久数据的更改,因此您不应该在应用程序生命周期事件中做任何事情。

     

如果必须,你可以尝试这样做:

     

SomeAsyncMethod()。AsTask()。Wait()

     

如果操作在超时期限内完成,并且由于需要而没有死锁   要抽取UI线程,它会起作用......但不要指望它。

答案 1 :(得分:-1)

试试这个:

private void Application_Closing(object sender, ClosingEventArgs e)
{
    var task = A.onEndApp();
    task.Wait();
}

async public static Task onEndApp()
{
    string temp = await doSomething();
    //code here
}

否则,你实际上只是分离一个永远不会有机会运行完成的线程,因为应用程序正在从它下面关闭,并且线程将在它运行之前被终止。