C#关于winform线程更新form的文本框输出的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#关于winform线程更新form的文本框输出的问题相关的知识,希望对你有一定的参考价值。

我需要写一个winform执行一套根据数据库表遍历文件并执行增删的功能。
现在需要在winform每检索一个文件,都在winform的textbox中输出一行"XXX文件未找到"、"XXX文件已删除"
因为处理需要几分钟事件,如果直接在button的click事件里写,winform会卡住,程序未响应,直到检索完数据库以后工作完成,才会在textbox里一次性显示所有的文字。
我现在想要达到的效果是,点击button后,winform不会卡住未响应,并且每处理数据库里的一条记录,都在textbox里显示一条"ID为XXX的记录文件未找到"或者"ID为XXX的记录文件已删除"。
我了解到需要新增一个工作线程处理这些耗时的工作,但是我并不知道如何去写这些代码,求指点如何使用新线程处理这份工作,新线程怎么才能操作form的文本框文字让她能够动态显示?

使用多线程和委托。

你的目的其实概括来说,就是后台线程去处理文件, 当“找到”或者“未找到”时,通知UI去更新文本为“XX找到”“XX未找到”。

伪代码:

//定义一个事件 

public delegate void MyDelegate(bool isDone, string requestResult);
//这里定义一个委托,有两个参数, 一个是是否结束,第二个是返回的结果值(string)
public event MyDelegate  myEvent = null;// 注册事件



var thread = new System.Threading.Thread(new System.Threading.ThreadStart(() =>

     //这里去遍历啊  执行啊 乱七八糟的  最好封装成函数  
     // rst是提示的文本, 需要你前面函数里面返回,比如"xx找到了";       
      myEvent.Invoke(true, rst);
      //当执行结束时, 返回false
      //myEvent.Invoke(false,rst);
)) 
 IsBackground = true ;
thread.Start();
sysbusyEvent += (state, result) =>

      Application.Current.Dispatcher.BeginInvoke(new Action(() =>
      
           if(result!=string.Empty)
           
               //前台UI更新
               myTextBox.Text = result ;
           
           if (state == false)
           
               sysbusyEvent = null; //清理事件
           
      ));
;

这样后台线程会去处理他的事情,每当他处理掉一件,就会Invoke回来一个状态给前台,

而UI线程(主线程)会一直监听这个事件,当有回调(Invoke)时,去处理这些信息,

就可以达到你要求的目的,即UI线程不阻塞(不会卡死),且后台还在执行一些耗时的运算。

参考技术A

百度搜索一下   

BackgroundWorker 简单使用教程

你只需要把bw_DoWork中的方法体换成你自己的循环和遍历就行了

当你处理完一个文件,要输出时,记得在那个bw_DoWork中用这种写法


 this.Invoke((MethodInvoker)delegate
 
 textBox1.AppendText"XXX文件未找到\\n");
textBox1.ScrollToCaret();
  );

以上是关于C#关于winform线程更新form的文本框输出的问题的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 设置进入窗口后在文本框里的默认焦点

我想在C# winform中点击按钮跳出一个对话框,对话框有个类似textbox文本框。

一个关于winform(C#)的富文本框的问题,希望大家能帮帮我,下面我仔细描述下我的需求

C# winform 程序中如何限制一个文本框中只输入数字和字母呢?

C# - Winforms - Combobox - 避免选择更新数据源的第一项

C# winform 两个定时器访问同一个变量