扒一扒C#BackgroundWorker使用中遇到的坑

25 篇文章 0 订阅
6 篇文章 0 订阅

C#中BackgroundWorker作为.NETFramework封装好的线程类,上手简单,可根据需要为其实例的DoWork、ProgressChanged、RunWorkerCompleted指定相应的委托:分别为DoWorkEventHandler、ProgressChangedEventHandler、RunWorkerCompletedEventHandler,然后再调用该实例的RunWorkerAsync(object argument==null)方法即可在单独线程(意思是非调用线程的另外线程中执行)。

坑,在BackgroundWorker的DoWork方法中操作UI控件(或其他异常)不报错。

老生常谈的东西,在.net中不允许在非ui线程是直接操作ui对象,BackgroundWorker亦是如此,DoWork中去直接操作控件对象(如文本框内容),不会报错,但会不执行该方法后的代码直接跳到RunWorkerCompleted(若已定义)执行。

RunWorkerCompleted中去修改控件内容则不需要通过textBox1.Invoke()来委托执行。(此处是BackgroundWorker线程结束,RunWorkerCompletedEventHandler的回调函数在主线程执行的原因,因为耗时2s的操作会卡住主线程)

public partial class Form1 : Form
{
    public static BackgroundWorker Worker;
    public Form1()
    {
        InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.Text = "InitSuccess";
        Worker = new BackgroundWorker();
        Worker.DoWork += new DoWorkEventHandler(DoWork);
        Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted);

    }

    private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Thread.Sleep(2000);
        textBox1.Text = "WorkerCompleted";
    }
    private delegate void EnableButtonCallBack();
    private void DoWork(object sender, DoWorkEventArgs e)
    {
        ChangeText();//不会改变控件内容
        //textBox1.Invoke(new EnableButtonCallBack(ChangeText));//可以改变控件内容
        Thread.Sleep(1000);
    }

    private void ChangeText()
    {
        textBox1.Text = "DoWork";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Worker.RunWorkerAsync();
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值