使用异步服务启动 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)));
}
}
我正在尝试加载一些后台服务来检查 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)));
}
}