允许无限循环中的窗口交互

时间:2016-03-18 00:59:17

标签: c# wpf

所以基本上我有一个窗口,在一个名为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部分,并且它有效,但它只做了一次,因此需要一个循环。

有没有办法在无限循环中使用我的应用程序?

1 个答案:

答案 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();