所以基本上我有一个窗口,在一个名为LoggerWindow
的单独窗口中显示日志信息,例如时间和信息。我正在使用此代码将项目添加到此窗口内的ListBox
:
protected void _OutputLineToConsole(LogLevel level, string line)
{
foreach (Window window in Application.Current.Windows)
{
if (window.GetType() == typeof(LoggerWindow))
{
ListBoxItem itemToAdd = new ListBoxItem();
itemToAdd.Content = line;
ListBox lb = (window as LoggerWindow).loggerBox;
lb.Items.Add(itemToAdd);
ListBoxItem justAddedItem = (ListBoxItem)lb.Items[lb.Items.Count - 1];
justAddedItem.Foreground = _LogColor(level); //gets brush color based on level
}
}
}
(注意:我在另一个文件中,这就是为什么这么复杂。)
还有一些代码我用来运行一些“回调管理器”,它从服务器注册回调并为它们分配处理程序。代码是这样的:
while (true)
{
manager.RunWaitCallbacks(TimeSpan.FromSeconds(1));
}
我注意到每当我运行我的应用程序时,整个事情就会冻结,我确信这是因为获得回调所必需的无限循环。我评论了它的while
部分,并且它有效,但它只做了一次,因此需要一个循环。
有没有办法在无限循环中使用我的应用程序?
答案 0 :(得分:1)
将while(true)
放入DoWork
的{{1}}。
查看:How to use WPF Background Worker
最好使用worker的取消机制而不是硬编码的BackgroundWorker
,这样你就可以在必要时停止循环,就像退出应用程序一样。
true
完成后,请致电worker = new BackgroundWorker
{
WorkerSupportsCancellation = true
};
worker.DoWork += (sender, eventArgs) =>
{
while (!worker.CancellationPending)
{
manager.RunWaitCallbacks(TimeSpan.FromSeconds(1));
}
};
worker.RunWorkerAsync();