C# 多线程防止界面假死的问题。。。
比如转换A表数据就实例化 ExtractDataA 类,调用其内部方法转换数据。我把这些类放在一个集合里循环执行数据的转换。在大量循环提取数据的时候会导致界面假死,不知道该怎么用多线程来处理这个问题。求大家指点。
//开始提取数据
private void btnStartExtract_Click(object sender, EventArgs e)
{
try
{
if (methodList.Count==0)
{
return;
}
this.lblDescription.Text = "正在准备提取数据...";
foreach (ExtractDataMethodClass methodItem in methodList)
{
if (methodItem.ISExcute)
{
this.lblDescription.Text= "正在执行" + methodItem.Name;
Assembly asmb = Assembly.LoadFrom(Application.StartupPath + "\\" + methodItem.DLLName);
//表示创建一个类的实例
object intance = asmb.CreateInstance(methodItem.ClassName);
if (DataExtract_SystemSetHelper.Instance.ISIncreaseMentData)
{
//执行增量提取方法
(intance as IDataExctaction).ExtractIncrementData(progressBar1,this.lblDescription);
}
else
{
//执行全量提取方法
(intance as IDataExctaction).ExtractFullData(progressBar1,this.lblDescription);
}
}
}
MessageBox.Show("完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
相关推荐
C# WinForm多线程防止界面假死源码
C# WinForm多线程防止界面假死源码,代码里面包含显示进度的例子,针对多线程使用的一个很好例子。供初级人员参考。
C# Application.DoEvents() 防界面假死例子。
请自行测试有Application.DoEvents() 和没有Application.DoEvents()的区别,即可。 有疑问可发送Email给我: Andrew.Wangxu@gmail.com
c#防止程序假死 - - 博客频道
c#防止程序假死 - - 博客频道
c#等待提示对话框,防止界面假死
呵呵,关键自己程序里要用到 所以开发了这个小功能 很多地方很粗糙,俺菜鸟,高手们就别贬我了。 使用的时候把2个dll放到你的程序目录,在资源管理器引用LOADing.dll 就可以了,DevComponents.DotNetBar2.dll为确定按钮控件的引用 列子: private void dl_Click(object sender, EventArgs e) { LOADing.FORMshow load = new LOADing.FORMshow(); load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); },false); } private void hand(object fr) { int i = 0; while (i < 100) { i++; ((LOADing.FORMshow)((object[])(fr))[0]).send((string)((object[])(fr))[0]+i.ToString()); System.Threading.Thread.Sleep(100); } } 主要用于处理数据的时候,提示用户处理过程,防止界面假死,数据处理完毕后会自动关闭窗体。 注:this为所要调用等待窗体的主窗体对象,中间为数据传递的委托,显示数据处理的过程.load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); });中new object[] 第一个参数一定要为固定的参数:创建LOADing.FORMshow的实例,后面再就可跟任意数据,都可在方法的过程中调用显示,最后的bool参数:false方法函数执行完毕后自动关闭窗体显示;true为方法执行完毕后出现确定按钮并阻塞主线程UI,点击确定后关闭提示窗体并取消阻塞线程,这么简单,用相信大家都会用了。 界面没有进行美化,感觉这样的就可以了,随后会升级为可自定义界面! 有问题加我QQ76230454
多线程正确调用,避免假死
正确使用多线程,需要定义委托,而在使用循环时,若不正确使用,会出现屏幕假死现象。结合自身测试,写出假死出现原因和修正方式。


