我正在尝试在我的WPF应用程序中实现“加载窗口”,当客户端想要向服务器发送消息时应该显示该应用程序,然后应该在收到响应后关闭。当我使用异步方法时,这应该不是一个大问题,但不知何故,窗口显示 收到响应后立即关闭(如预期的那样)。
以下是一些代码段
public async Task<CommunicationMessage> SendAndReadMessageSync(string message, bool showLoadingScreen = true) {
// Show loading screen if needed
if (showLoadingScreen == true) {
await Globals.MessageController.ShowLoadingScreen(); // This method is the second one
}
// Send a message to the server
SendMessageSync(message);
// Receive the response from the server
CommunicationMessage response = ReadMessageSync();
// Close loading screen
if (showLoadingScreen == true) {
await Globals.MessageController.CloseLoadingScreen();
}
// return the response
return response;
}
public async Task ShowLoadingScreen(string title = "Lade Daten", string message = "Einen Moment Geduld bitte") {
await Dispatcher.BeginInvoke(new Action(async delegate {
// Create the loading screen
LoadingScreen ls = new LoadingScreen(title, message) {
IsModal = true
};
// Store the screen inside list
loadingScreens.Add(ls);
// Show the screen
await this.ShowChildWindowAsync(ls, ChildWindowManager.OverlayFillBehavior.FullWindow);
}));
}
我对执行的看法是加载屏幕将独立于 SendMessageSync() -Method显示,可能持续10秒。客户端获得响应后,加载屏幕将关闭。
我做错了什么或忘记了什么?如果您需要更多代码,请告诉我
非常感谢!
答案 0 :(得分:2)
我建议封装在任务中发送消息。现在它将在UI线程上运行。所以看起来UI线程很忙,根本无法显示你的等待窗口。
答案 1 :(得分:0)
在此方案中,您可以使用Dispatcher.Invoke而不是Dispatcher.BeginInvoke。在这种情况下,Dispatcher.Invoke将立即显示窗口。