C#关于winform线程更新form的文本框输出的问题
我需要写一个winform执行一套根据数据库表遍历文件并执行增删的功能。现在需要在winform每检索一个文件,都在winform的textbox中输出一行"XXX文件未...
我需要写一个winform执行一套根据数据库表遍历文件并执行增删的功能。
现在需要在winform每检索一个文件,都在winform的textbox中输出一行"XXX文件未找到"、"XXX文件已删除"
因为处理需要几分钟事件,如果直接在button的click事件里写,winform会卡住,程序未响应,直到检索完数据库以后工作完成,才会在textbox里一次性显示所有的文字。
我现在想要达到的效果是,点击button后,winform不会卡住未响应,并且每处理数据库里的一条记录,都在textbox里显示一条"ID为XXX的记录文件未找到"或者"ID为XXX的记录文件已删除"。
我了解到需要新增一个工作线程处理这些耗时的工作,但是我并不知道如何去写这些代码,求指点如何使用新线程处理这份工作,新线程怎么才能操作form的文本框文字让她能够动态显示? 展开
现在需要在winform每检索一个文件,都在winform的textbox中输出一行"XXX文件未找到"、"XXX文件已删除"
因为处理需要几分钟事件,如果直接在button的click事件里写,winform会卡住,程序未响应,直到检索完数据库以后工作完成,才会在textbox里一次性显示所有的文字。
我现在想要达到的效果是,点击button后,winform不会卡住未响应,并且每处理数据库里的一条记录,都在textbox里显示一条"ID为XXX的记录文件未找到"或者"ID为XXX的记录文件已删除"。
我了解到需要新增一个工作线程处理这些耗时的工作,但是我并不知道如何去写这些代码,求指点如何使用新线程处理这份工作,新线程怎么才能操作form的文本框文字让她能够动态显示? 展开
2个回答
展开全部
使用多线程和委托。
你的目的其实概括来说,就是后台线程去处理文件, 当“找到”或者“未找到”时,通知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线程不阻塞(不会卡死),且后台还在执行一些耗时的运算。
展开全部
百度搜索一下
BackgroundWorker 简单使用教程
你只需要把bw_DoWork中的方法体换成你自己的循环和遍历就行了
当你处理完一个文件,要输出时,记得在那个bw_DoWork中用这种写法
this.Invoke((MethodInvoker)delegate
{
textBox1.AppendText"XXX文件未找到\n");
textBox1.ScrollToCaret();
});
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询