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