我正在制作一个小程序,主要提供来自不同来源的信息,我需要在后台做一个持续的循环来完成艰苦的工作。但我不能按一个按钮来获取这些信息,它需要自己运行。
我对整个WPF的想法都很陌生,即使整个XAML部分感觉很整洁,我仍然在努力适应整个概念感受事件驱动的想法。
我查看了System.ComponentModel.BackgroundWorker类,但它感觉不对,因为它是由DoWOrk和WorkComplete定义的,而且这永远不会是WorkComplete。
执行后台处理的正确方法是什么,避免用户交互?
答案 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传回信息
它是一个对象,所以你可以传递你需要的任何东西