簡體   English   中英

WPF 應用程序中的異步 OnStartup

[英]Async OnStartup in a WPF application

我有一個 WPF 應用程序。 如果它是用一些命令行參數啟動的,它應該只做一些數據庫操作然后關閉自己。 這是在 App.xaml.cs 中完成的:

public partial class App : Application
{
  protected override async void OnStartup(StartupEventArgs e)
  {
    base.OnStartup(e);
    if(Environment.GetCommandLineArgs().Any(x => x == "blabla"))
    {
      await PerformDatabaseOperations()
      Environment.Exit(0);   
    }
    
    var mainWindow = new MainWindow();
    mainWindow.Show();
    this.MainWindow = mainWindow;
  }
}

這段代碼的問題是PerformDatabaseOperations()方法沒有完全執行。 當它遇到第一個實際的數據庫操作時,程序就退出了。 我認為這是因為OnStartup不返回Task ,因此無法等待。 因此,行Environment.Exit(0); 在此方法內遇到第一個異步操作時執行。

有沒有辦法來解決這個問題?

您可以從這樣的同步方法中調用異步方法:

YourAsyncMethod().Wait();

因此,您可以使您的 OnStartup-Method 同步並執行您的數據庫操作,如下所示:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    if(Environment.GetCommandLineArgs().Any(x => x == "blabla"))
    {
        PerformDatabaseOperations().Wait();
        Environment.Exit(0);   
    }

    var mainWindow = new MainWindow();
    mainWindow.Show();
    this.MainWindow = mainWindow;
}

從應用程序的角度來看,您的 OnStartup 方法會在第一次await時返回。 那時它還沒有創建或顯示任何 windows。

我的猜測是,這會導致應用程序終止,因為沒有啟動消息循環。 您可以檢查您在Environment.Exit(0)上放置斷點的理論,我的猜測是這不會被擊中。

在執行數據庫操作之前創建 mainWindow 可能會解決問題,但會導致顯示空的 window,但我不確定是否有任何好的解決方法來解決該問題。 在創建類似的應用程序時,我采用了另一種方式,使用顯示 UI window 的控制台程序,在 UI 之外留下一個控制台框。

請注意,在使用async void時,您應該非常小心地處理任何異常,否則這些異常將會丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM