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中用这种写法
textBox1.AppendText"XXX文件未找到\\n");
textBox1.ScrollToCaret();
);
以上是关于C#关于winform线程更新form的文本框输出的问题的主要内容,如果未能解决你的问题,请参考以下文章
我想在C# winform中点击按钮跳出一个对话框,对话框有个类似textbox文本框。
一个关于winform(C#)的富文本框的问题,希望大家能帮帮我,下面我仔细描述下我的需求
C# winform 程序中如何限制一个文本框中只输入数字和字母呢?