我试着在后台运行我的windows应用程序。使用从离开应用程序开始的While循环,一切都很好。但是当我再次进入应用程序时,应用程序挂在无限循环中,不会加载。这就是为什么我在while循环中编写了一个条件,但是只要while循环正在运行,就不会考虑其他代码。是否有异步while循环或其他东西来解决这个问题。
下面是我来自App.xaml.cs的代码:
private void Application_Closing(object sender, ClosingEventArgs e)
{
WhileLoop();
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
Continue = false;
}
static bool Continue = false;
void WhileLoop()
{
Continue = true;
while(Continue == true)
{
//do something in background
}
}发布于 2014-01-27 15:52:15
您需要将循环移动到BackgroundWorker上,因为一旦启动while循环,它将占用UI线程中的CPU,这意味着不会处理其他消息,即Application_Activated事件。
问题是,您正在尝试打破一个运行在同一个线程中的无限循环。如果您的while循环位于不同的线程上(即不占用UI线程),那么您的代码应该可以工作。但是,我认为有更好的方法可以不使用
static字段例如,一种更健壮的方法是在BackgroundWorker上保留对Application_Closing的引用,然后在Application_Activated上调用CancelAsync,这将允许您在BW中使用CancellationPending属性,以便更安全地关闭后台进程。
发布于 2014-01-27 16:15:35
using System.Threading;
ManualResetEventSlim waitEvent = new ManualResetEventSlim(false); // start in the unsignaled state
async void Application_Closing(object sender, ClosingEventArgs e)
{
await MyLoop(); // execute asynchronously
waitEvent.Wait(); // wait for a signal to continue
}
void Application_Activated(object sender, ActivatedEventArgs e)
{
waitEvent.Reset(); // set unsignaled
}
Task MyLoop()
{
while(true)
{
if(condition)
break;
}
waitEvent.Set(); // signal the app to continue
}https://stackoverflow.com/questions/21385254
复制相似问题