![](/img/trans.png)
[英]Caliburn Micro View First Bootstrapper OnStartup for WPF application
[英]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.