为了线程的安全性和降低代码的依赖程度,C# windows编程中线程函数与调用的界面之间通信最好用委托来解决。
参数交互函数如下:
delegate void SetControlValueCallback(Control oControl, string propName, object propValue); //声明指向调用函数的委托 /// <summary> /// 线程调用的设置界面控件属性的函数 /// </summary> /// <param name="oControl">控件对象</param> /// <param name="propName">属性名称</param> /// <param name="propValue">属性值</param> private void SetControlPropertyValue(Control oControl, string propName, object propValue) { if (oControl.InvokeRequired) { SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue); oControl.Invoke(d, new object[] { oControl, propName, propValue }); } else { Type t = oControl.GetType(); System.Reflection.PropertyInfo[] props = t.GetProperties(); foreach (System.Reflection.PropertyInfo p in props) { if (p.Name.ToUpper() == propName.ToUpper()) { p.SetValue(oControl, propValue, null); } } } }
使用方法:
如启动如下线程:
Thread t = new Thread(new ThreadStart(LoadData)); t.Start();
线程函数如下:
/// <summary> /// Load all data from database /// </summary> void LoadData() { string SqlStr = "SELECT * FROM ExtensionPhone ORDER BY Department,Division"; DataSet ds = this.GetDataSet(SqlStr); if (ds == null) return; dt = ds.Tables[0]; //在线程中直接用下面的两行会出现错误 //grd.DataSource = dt; //lbTotal.Text = "Total Records: " + dt.Rows.Count.ToString(); //用委托的函数代替设置属性和传递参数 SetControlPropertyValue(grd, "DataSource", dt); SetControlPropertyValue(txtSearch, "Focus", null); SetControlPropertyValue(lbTotal, "Text", "Total Records: " + dt.Rows.Count.ToString()); }
线程执行结果如下图:
相关推荐
多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。这里采用Task + MethodInvoker的方式完成跨线程对UI对的修改。
WinForm C# 多线程编程并更新界面(UI)
使用delegate和Invoke,使用delegate和BeginInvoke,使用BackgroundWorker组件,使用SynchronizationContext组件
使用开发工具为VS2013;.net:4.0 多线程异步刷新ui界面,实时获取任务进度并进行反馈。
C#WinForm,多线程快速刷新界面。没什么高级技术。只希望能解决一下需要多线程与UI快速交互的朋友的问题。
C# 包括C#的界面换皮肤和dll的引用,制作绚丽的界面效果
WinForm后台线程与UI线程通讯 实现进度条变化
c#winForm软件UI设计,使用传统的winform控件加上DevExpress控件。
C# WinForm多线程防止界面假死源码,代码里面包含显示进度的例子,针对多线程使用的一个很好例子。供初级人员参考。
C# Winform 利用线程延时创建子窗体并且可跨线程控制主窗体的控件
主要给大家介绍了关于c# winform异步不卡界面的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
以学生管理系统为例做的UI,蓝色的风格,实现了学生信息的增删改查和分类的功能,因为太过简单,就不继续写下去了,里面有一些小功能,例如时间自动一直更新等等,界面有什么不足的话,希望大家批评指教,希望大家...
C# winform 多线程 让子线程也能操作界面的方法 源代码
C# winform 防止界面卡住 线程 委托:单击按钮时创建线程,线程调用委托,执行委托的方法,实现更新窗体界面时不卡住。
C#WinformUI界面工具 皮肤选择器 Winform皮肤控件,选择皮肤,使用皮肤
Winform实现多线程异步更新UI(进度及状态信息) 实例代码
C# 开发全套31个UI组件Winform 开源共享 开源 控件
C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解 C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解
这是一个C# winform的多线程操作示例,可以参考解决界面卡死问题