主线程var tsk = Task.Factory.StartNew(() =>
{ UI_TabPageItem();});主线程底下动态增加控件
public UI_TabPageItem(string caption, Control displayControl)
{
……
……
……
Controls.Add(_displayControl);
}
此处会报错 :线程间操作无效: 从不是创建控件“UFrm_Dept”的线程访问它。
{ UI_TabPageItem();});主线程底下动态增加控件
public UI_TabPageItem(string caption, Control displayControl)
{
……
……
……
Controls.Add(_displayControl);
}
此处会报错 :线程间操作无效: 从不是创建控件“UFrm_Dept”的线程访问它。
解决方案 »
- wavecom短信猫2次开发C#winform项目,连接GSM Modem失败怎么回事
- 通过Socket群发数据的问题
- VS2008怎么这么卡啊 谁有办法让他快点啊
- 正在做一个在线出题系统,需要将WORD版试题导入到SQLServer中。
- C#调用 C DLL问题,懂的来抢分了
- 拖盘
- 请教:关于combobox 第一次点击自动收回
- 在做安装程序时,怎样判断系统是否安装有framework1.1与MDAC。如果没有就安装,如果安装了这两项就跳过安装这两项,而直接安装应用程序?
- C# 内存不足问题,急!!!
- DataSet.Merge从DataRow[]中合并数据不成功 新手请教
- C#避免产生的随机密码重复
- 怎么能把从数据库读出的数转换成int
this.Invoke(delegate(){
//你要访问的主线程代码在这里添加
});
this.Invoke(new MethodInvoker(delegate(){
//你要访问的主线程代码在这里添加
}));
以前类似问题通过 BeginInvoke解决掉了,但这次却不好使!
if(this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate(){
//你要访问的主线程代码在这里添加
}));
}
else
{
//直接加
}
ControlDelegate.InvokeMethod // 跨线程执行控件上的方法.
ControlDelegate.GetProperty // 跨线程获取控件上的属性.
ControlDelegate.SetProperty // 跨线程设置控件上的属性.
详情请看下面的代码,完整的,编译成一个lib就可以了。
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;namespace CommonTools.Control
{
/// <summary>
/// 基于线程安全的控件处理委托类.
/// </summary>
public class ControlDelegate
{
/// <summary>
/// <para>基于线程安全的控件方法调用委托.</para>
/// </summary>
/// <param name="control">控件实例.</param>
/// <param name="method">控件方法名.</param>
/// <param name="value">控件方法入参.</param>
delegate void InvokeMethodCallBack(System.Windows.Forms.Control control, string method, object value); /// <summary>
/// <para>基于线程安全的控件方法调用.</para>
/// </summary>
/// <param name="control">控件实例.</param>
/// <param name="method">控件方法名.</param>
/// <param name="value">控件方法入参.</param>
public static void InvokeMethod(System.Windows.Forms.Control control, string method, object value)
{
if (control.InvokeRequired == true)
{
InvokeMethodCallBack d = new InvokeMethodCallBack(InvokeMethod);
control.Invoke(d, new object[] { control, method, value });
}
else
{
Type type = control.GetType();
type.InvokeMember(method, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, control, new object[] { value });
}
} /// <summary>
/// <para>基于线程安全的控件属性获取委托.</para>
/// </summary>
/// <param name="control">控件实例.</param>
/// <param name="property">控件属性名.</param>
/// <returns></returns>
delegate object GetPropertyCallBack(System.Windows.Forms.Control control, string property); /// <summary>
/// <para>基于线程安全的控件属性获取.</para>
/// </summary>
/// <param name="control">控件实例.</param>
/// <param name="property">控件属性名.</param>
/// <returns></returns>
public static object GetProperty(System.Windows.Forms.Control control, string property)
{
if (control.InvokeRequired == true)
{
GetPropertyCallBack d = new GetPropertyCallBack(GetProperty);
return control.Invoke(d, new object[] { control, property });
}
else
{
Type type = control.GetType();
return type.InvokeMember(property, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance, null, control, null);
}
} /// <summary>
/// <para>基于线程安全的控件属性设置委托.</para>
/// </summary>
/// <param name="control">控件实例.</param>
/// <param name="property">控件属性名.</param>
/// <param name="value">控件属性设置值.</param>
delegate void SetPropertyCallBack(System.Windows.Forms.Control control, string property, object value); /// <summary>
/// <para>基于线程安全的控件属性设置.</para>
/// </summary>
/// <param name="control">控件实例.</param>
/// <param name="property">控件属性名.</param>
/// <param name="value">控件属性设置值.</param>
public static void SetProperty(System.Windows.Forms.Control control, string property, object value)
{
if (control.InvokeRequired == true)
{
SetPropertyCallBack CallBack = new SetPropertyCallBack(SetProperty);
control.Invoke(CallBack, new object[] { control, property, value });
}
else
{
Type type = control.GetType();
type.InvokeMember(property, BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance, null, control, new object[] { value });
}
}
}
}