WPF后台处理没有用户交互?

时间:2014-01-01 13:50:28

标签: c# wpf wpf-4.0

我正在制作一个小程序,主要提供来自不同来源的信息,我需要在后台做一个持续的循环来完成艰苦的工作。但我不能按一个按钮来获取这些信息,它需要自己运行。

我对整个WPF的想法都很陌生,即使整个XAML部分感觉很整洁,我仍然在努力适应整个概念感受事件驱动的想法。

我查看了System.ComponentModel.BackgroundWorker类,但它感觉不对,因为它是由DoWOrk和WorkComplete定义的,而且这永远不会是WorkComplete。

执行后台处理的正确方法是什么,避免用户交互?

2 个答案:

答案 0 :(得分:0)

我建议使用System.Threading.Timer。这里有一些示例代码,它将使用当前时间每秒更新一个名为timeLabel的标签:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Timer timer = new Timer(TimerElapsedHandler, null, 0, 1000);
    }

    private void TimerElapsedHandler(object state)
    {
        this.Dispatcher.Invoke(() => { timeLabel.Content = DateTime.Now.ToLongTimeString(); });
    }
}

你也可以使用某种BackgroundWorker / Task /,让它在一个单独的线程中执行类似下面的操作:

while (...)
{
    this.Dispatcher.Invoke(() => { timeLabel.Content = DateTime.Now.ToLongTimeString(); });
    Thread.Sleep(1000);
}

答案 1 :(得分:0)

BackgroundWorker还有一个ReportProgress
使用userState As Object传回信息
它是一个对象,所以你可以传递你需要的任何东西

BackgroundWorker.ReportProgress Method (Int32, Object)