使用异步服务启动 WPF 应用程序

Start WPF app with async services

我正在尝试加载一些后台服务来检查 Internet 上的一些信息,同时应用程序正在加载并显示初始屏幕。此外,如果初始屏幕的进度已完成,它应该显示在主窗口并继续工作,定期检查网络中的更新。

我已经尝试将此用于应用程序:

    public IpSumApp()
    {
        ApplicationInitialize = _applicationInitialize;
    }

    public static new IpSumApp Current
    {
        get { return Application.Current as IpSumApp; }
    }

    public MainWindow mainwindow;

    public Watch_Service SurveillanceSystem;

    internal delegate void ApplicationInitializeDelegate(Splash splashWindow);
    internal ApplicationInitializeDelegate ApplicationInitialize;

    private void _applicationInitialize(Splash splashWindow)
    {
        double progressbar = 0;

        SurveillanceSystem = new Watch_Service();
        progressbar = progressbar + .1;
        splashWindow.SetProgress(progressbar);

        Start_Watch_Service(this);
        progressbar = progressbar + .1;
        splashWindow.SetProgress(progressbar);

        splashWindow.SetProgress(1);

        // Create the main window, but on the UI thread.
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Invoker)delegate
        {
            mainwindow = new MainWindow();
            mainwindow.Show();

        });
    }

此外,这是 Watch 服务代码,每 2 小时检查一次网络:

    private async Task Start_Watch_Service(IpSumApp CheckApp)
    {
            while (CheckApp._contentLoaded == true)
            {

                SurveillanceSystem.DOF_Links = await SurveillanceSystem.Watch_DOF("www.emol.com");
                double CheckWaitTime = 2*60;
                Thread.Sleep(60 * Convert.ToInt32(Math.Round(1000 * CheckWaitTime)));
            }
    }

我已经试用了该应用程序。当网页中有所需数据(PDF)时,它会下载它并执行缓慢的操作并继续。最终,主窗口出现了。 但是,当什么都没有的时候,负载就停在了

Thread.Sleep(60 * Convert.ToInt32(Math.Round(1000 * CheckWaitTime)))

当您使用 Thread.Sleep 时,您正在阻塞 UI 线程并且它无法响应任何 windows 事件,因此它没有响应。

如果您在 Start_Watch_Service 中尝试做的是有一个重试周期,它们之间有一个间隔,请使用异步等待的 Task.Delay 而不是阻塞的 Thread.Sleep

private async Task Start_Watch_Service(IpSumApp CheckApp)
{
    while (true)
    {
        SurveillanceSystem.DOF_Links = await SurveillanceSystem.Watch_DOF("www.emol.com");
        if (CheckApp._contentLoaded)
        {
            break;
        }
        double CheckWaitTime = 2*60;
        await Task.Delay(60 * Convert.ToInt32(Math.Round(1000 * CheckWaitTime)));
    }
}