码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-08-11 18:18:52      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:winform   http   使用   io   数据   for   ar   art   

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 ||
       !@ 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的数据,布布扣,bubuko.com

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

标签:winform   http   使用   io   数据   for   ar   art   

原文地址:http://my.oschina.net/u/1766067/blog/300105

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!