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

时间:2015-01-23 19:08:39

标签: c# .net task-parallel-library async-await

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

我已尝试将此用于App:

    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 Service Code,它每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)时,它会对其进行下载并执行慢速操作并继续。最终,Mainwindow出现了。 但是,当没有任何内容时,负载会在

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

1 个答案:

答案 0 :(得分:2)

当您使用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)));
    }
}