1. 在.net framwork 2.0中,能夠經過如下代碼來實現:html
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 });
}
}
|
調用方式以下: express
1
2
3
|
// thread-safe equivalent of
// myLabel.Text = status;
SetControlPropertyThreadSafe(myLabel,
"Text"
, status);
|
2.在.net 3.0或者更新的版本中,你能夠重寫上面的方法做爲一個Control類的擴展方法,能夠簡化調用方式,具體代碼以下:
c#
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.最簡單的匿名方法調用:ui
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
|
以上方法蒐集自網絡,僅供參考。this
轉載請註明:文章轉載自:[169IT-最新最全的IT資訊]
本文標題:c#多線程更新窗口(winform)GUI的數據spa