c#多线程更新窗口(winform)GUI的数据

1. 在.net framwork 2.0中,可以通过以下代码来实现:


1

2

3

4

5

6

7

8

9

10

11

12


private
delegate
void
SetControlPropertyThreadSafeDelegate(Control control,
string
propertyName,
object
propertyValue);

public
static
void
SetControlPropertyThreadSafe(Control control,
string
propertyName,
object
propertyValue)

{

  
if
(control.InvokeRequired)

  
{

    
control.Invoke(
new
SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe),
new
object
[] { control, propertyName, propertyValue });

  
}

  
else

  
{

    
control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty,
null
, control,
new
object
[] { propertyValue });

  
}

}

调用方式如下:


1

2

3


// thread-safe equivalent of

// myLabel.Text = status;

SetControlPropertyThreadSafe(myLabel,
"Text"
, status);

2.在.net 3.0或者更新的版本中,你可以重写上面的方法作为一个Control类的扩展方法,可以简化调用方式,具体代码如下:


1

myLabel.SetPropertyThreadSafe(
"Text"
, status);

在.net 3.0以上的版本完整的调用步骤如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19


private
delegate
void
SetPropertyThreadSafeDelegate<TResult>(Control @
this
, Expression<Func<TResult>> property, TResult value);

public
static
void
SetPropertyThreadSafe<TResult>(
this
Control @
this
, Expression<Func<TResult>> property, TResult value)

{

  
var
propertyInfo = (property.Body
as
MemberExpression).Member
as
PropertyInfo;

  
if
(propertyInfo ==
null
||

      
[email protected]
this
.GetType().IsSubclassOf(propertyInfo.ReflectedType) ||

      
@
this
.GetType().GetProperty(propertyInfo.Name, propertyInfo.PropertyType) ==
null
)

  
{

    
throw
new
ArgumentException(
"The lambda expression ‘property‘ must reference a valid property on this Control."
);

  
}

  
if
(@
this
.InvokeRequired)

  
{

    
@
this
.Invoke(
new
SetPropertyThreadSafeDelegate<TResult>(SetPropertyThreadSafe),
new
object
[] { @
this
, property, value });

  
}

  
else

  
{

    
@
this
.GetType().InvokeMember(propertyInfo.Name, BindingFlags.SetProperty,
null
, @
this
,
new
object
[] { value });

  
}

}

通过使用LINQ和lambda表达式使代码更加简洁:


1

myLabel.SetPropertyThreadSafe(() => myLabel.Text, status);
// status has to be a string or this will fail to compile

3.最简单的匿名方法调用:


1

2

3

4

5

6


///...blah blah updating files

string
newText =
"abc"
;
// running on worker thread

this
.Invoke((MethodInvoker)
delegate
{

    
someLabel.Text = newText;
// runs on UI thread

});

///...blah blah more updating files

以上方法搜集自网络,仅供参考。

转载请注明:文章转载自:[169IT-最新最全的IT资讯]
本文标题:c#多线程更新窗口(winform)GUI的数据

c#多线程更新窗口(winform)GUI的数据

时间: 2024-12-16 17:58:49

c#多线程更新窗口(winform)GUI的数据的相关文章

多线程更新已排序的Datagridview数据,造成数据错位

多线程更新已排序的Datagridview数据,触发Datagridview的auto-sort时间,数据重新排序,造成后面更新数据的更新错误. 解决方法: 方法一.设置Datagridview的表头属性,DataGridViewColumnSortMode 1. 如果已经有默认的排序表头DataGridView.SortedColumn, 则 : DataGridViewColumn column = dgv.SortedColumn; //默认的排序列 column.SortMode = D

asp.net中Winform开发框架之数据即时更新的实现

在开篇之前,首先介绍一下Winform开发框架中的界面层的继承关系,首先我把所有窗体区分为三类,一类是普通的窗体,一类编辑窗体,还有一类是列表显示窗体.窗体的集成可以封装处理很多东西,良好的封装和继承,可以为我们提高效率,减少重复代码,它的作用不再在此讨论和强调. 采用窗体继承,极大程度上统一了界面,并且对常用的界面操作,提供了良好的封装,如基础数据编辑.新增窗体积累封装了对回车.方向键.数据刷新.异常处理.数据检查.数据保存.数据更新等接口,为窗体的数据处理提供了很大的方便性.而数据查询显示窗

Winform 多个窗口编辑同一条数据同步的实现

场景: 一个主窗口中,可以在列表(DataGridView)里选中一条记录编辑,打开一个编辑窗口(非模态窗口),编辑窗口保存后需要刷新父窗口,由于编辑窗口是非模态窗口,如果打开了多个窗口,并且都是编辑同一条数据,那么一个窗口保存(并关闭)后,需要通知其它正在打开的窗口"数据有更改,需要刷新" 首先,刷新父窗口,如果是打开编辑窗口是模态窗口,那么可以类似如下的实现(伪代码): FormEdit frm = new FormEdit(); frm.EditId = 选中数据行对应的id;

拒绝卡顿——在WPF中使用多线程更新UI

有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: ????public partial class MainWindow : Window????{????????public MainWindow()????????{????????????InitializeComponent();????????????this.Dispatcher.Invoke(new Action(()=> { }));????????????this.Loaded

Android多线程更新UI的方式

Android下,对于耗时的操作要放到子线程中,要不然会残生ANR,本次我们就来学习一下Android多线程更新UI的方式. 首先我们来认识一下anr: anr:application not reponse:应用程序无响应 主线程:UI线程 anr产生的原因:主线程需要做很多重要的事情,响应点击事件,更新ui,如果在主线程里面阻塞时间过久,应用程序就会无响应,为了避免应用程序出现anr,所有的耗时的操作,都应该放在子线程中执行. 认识了anr后,我们就来学习一下怎样在Android下开启多线程

winform导出dataviewgrid数据为excel的方法

本文实例讲述了winform导出dataviewgrid数据为excel的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: #region 导出dataViewGrid视图中的数据为xls格式 private void btnExportList_Click(object sender, EventArgs e) { string fname = string.Empty; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter =

layer.js子窗口关闭并传数据到父窗的方法

昨晚整了很晚,一直找不到方法.去官网api看了好久,又在网上搜了很久 始终找不到答案.今天自己终于找到了方法. 难点:因为 确认和取消按钮都是在父窗 调用js生成的按钮.只能从父窗回调的时候去去数据并关闭子窗口.并不是子窗口自己关闭并把数据传到父窗.而网上给出的很多答案都是子窗口自己关闭并传数据到父窗的方法. [贴出我自己的代码,大概实现了流程.具体自己根据情况修改] 我的代码功能是 子窗口要传递数组给父窗,具体复杂的数据格式(如json等)类似 1.子窗口代码 var urls; functi

C# 在多线程内控制winform控件

private delegate void FlushClient(); //委托 private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(ThreadFunction); //创建一个线程 thread.IsBackground = true; thread.Start(); } private void ThreadFunction() { while (true) { FlushCli

sql server 更新表,每天的数据分固定批次设置批次号sql

按表中的字段 UpdateTime 按每天进行编号,每天的编号都从1开始编号,并附带表的主键 cid,把数据存入临时表中 WITH temp AS (SELECT cid,updatetime, ROW_NUMBER() OVER (PARTITION BY CONVERT(varchar(10), UpdateTime, 20) ORDER BY updatetime) AS Row_Num FROM Customer_Transfer ) 从临时表中根据主键cid进行更新 BatchNo,给