所有代码运行后显示的C#异步窗口

时间:2016-08-29 10:48:27

标签: c# wpf asynchronous

我正在尝试在我的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秒。客户端获得响应后,加载屏幕将关闭。

我做错了什么或忘记了什么?如果您需要更多代码,请告诉我

非常感谢!

2 个答案:

答案 0 :(得分:2)

我建议封装在任务中发送消息。现在它将在UI线程上运行。所以看起来UI线程很忙,根本无法显示你的等待窗口。

答案 1 :(得分:0)

在此方案中,您可以使用Dispatcher.Invoke而不是Dispatcher.BeginInvoke。在这种情况下,Dispatcher.Invoke将立即显示窗口。