WPF 的 BackgroundWorker

最近在做 WPF 显示和控制网络摄像机的任务。一个重要的小问题是窗口显示与后台处理的同步问题。例如,在登录(或切换状态、播放视频等)的时候,如果这么写代码:

private void BtnLogin_Click(object sender, RoutedEventArgs e)
{
    bool isConnected = Login(m_IP, m_Port);
    if (isConnected)
    {
        MessageBox.Show("登录成功!");
    }
    else
    {
        MessageBox.Show("登录失败!");
    }
}

那么在登录状态返回之前,窗口将一直无法响应用户操作(如移动等)。这是因为状态显示与后台处理置于同一个线程中,这显然是不合理的。

所以,更合理的做法应该是将窗口的控制与显示,和后台数据的处理,放在两个不同的线程中异步处理。WPF 的 BackgroundWorker 可以十分简洁地实现这一点。关于 BackgroundWorker,文章 Multi-threading with the BackgroundWorker 介绍得非常好,本文基于它做一些笔录。

简单实例

假设我们要在后台统计 1~10000 之间所有能被 42 整除的数字的个数,并在每次找到一个时,实时地在前端显示出来。

首先在代码开头处引用:

using System.ComponentModel;

并在事件响应函数(如 Button_Click)的主体部分加入:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync(10000);

也就是对 worker 对象添加了三个事件处理函数:DoWork, ProgressChanged 和 RunWorkerCompleted。DoWork 用于后台数据处理的主要过程,并在必要时候汇报进度(ReportProgress);ProgressChanged 用于在 DoWork 汇报进度时决定做什么;RunWorkerCompleted 用于在 DoWork 结束时执行后续的处理或显示等工作。

完整代码

MainWindow.xaml:

<Window x:Class="MTTest.MainWindow"
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值