c跨线程访问控件
⑴ C#如何在线程中访问控件对象
利用ListView.Invoke解决跨线程安全调用,关键代码如下:
voidFindFileInDir(){
if(listView2.InvokeRequired)
{
//跨线程调用
listView2.Invoke(newMethodInvoker(delegate
{
listView2.Items.Add(path);
}));
}
else
{
//直接调用
listView2.Items.Add(path);
}
}//EndofFindFileInDir
⑵ c#如何跨线程调用窗体控件
要从其他跨线程存取调用控件,可采用以下两种方法之一:
方法1)不进行线程安全的检查
方法2)通过委托的方式
代码如下所示
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
//方法1:不进行跨线程安全检查
//System.Windows.Forms.Control.=false;
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
Threadth1=newThread(newThreadStart(CalNum));
th1.Start();
}
privatevoidCalNum()
{
//button1.Enabled=false;
intresult=0;
for(inti=1;i<100000000;i++)
{
result+=i;
}
SetCalResult(result);
//button1.Enabled=true;
}
//方法2:检查是否跨线程,然后将方法加入委托,调用委托
(intresult);
privatevoidSetCalResult(intresult)
{
if(label2.InvokeRequired==true)
{
SetTextHandlerset=newSetTextHandler(SetCalResult);//委托的方法参数应和SetCalResult一致
label2.Invoke(set,newobject[]{result});//此方法第二参数用于传入方法,代替形参result
}
else
{
label2.Text=result.ToString();
}
}
}
⑶ C#窗体程序中,为什么有时候直接跨线程使用控件也不会报错
直接跨线程使用控件 那是非线程安全,最好不用,尽量用委托吧
⑷ 虚心求教c#在其他类中跨线程调用form中的控件,如何实现呢
不建议在类中直接访问控件,这不符合低耦合的设计要求,有些正式项目维护很麻烦的,特别是跨线程。
下面用我自己的一个扫描枪项目举例
1、在你的业务类中定义事件委托,将要处理的参数通过事件传递给事件函数(如果你传递的数据较多,需要另外定义一个特定参数类,使用属性定义包含你要传递的数据)。
(objectSender,stringtext);//定义扫描事件的委托
;//定义扫描事件对象,该对象用于外部程序挂接事件响应函数
//定义一个发送事件的函数
(stringtext)
{
if(OnStartScanning!=null)
OnStartScanning(_Sender,text);//_Sender是调用该对象时传入的发生源,即某文本框控件,此处传回给事件处理(响应)函数,其中text为扫描到的并经过业务对象检查后的文本(条码)
}
2、在你的业务类中需要操作控件地方,通过事件发送函数触发事件,将参数发送给事件函数处理。
下面在窗口代码中定义
3、为事件响应函数定义一个异步委托,该委托由事件响应函数调用,实现跨线程访问窗口控件
private delegate void OnThreadStart(object sender);
4、实例化业务对象,定义一个为该对象服务的,处理窗口控件的事件响应函数。
=newScanningGunMonitor();
privatevoidProctScanMonitor_OnStartScanning(objectsender,stringText)
{
//这里是重点,自定义类对象的事件触发会导致与窗口不在一个线程,通过下面的代码进行异步访问重新访问自己
if(InvokeRequired)
{
OnThreadStartmydelgate=newOnThreadStart(ProctScanMonitor_OnStartScanning);
//异步的委托
this.Invoke(mydelgate,newobject[]{sender,Text});
return;
}
//窗口线程可执行的代码
TextBoxbox=(TextBox)sender;
box.Text=Text;
box.Select(box.TextLength,0);
}
5、在初始化的地方为该对象添加定义的事件响应函数,业务对象触发事件时会调用它。
ProctScanMonitor.OnStartScanning+=newScanningGunMonitor.StartScanning(ProctScanMonitor_OnStartScanning);//添加事件响应
⑸ c# 跨线程访问控件
用委托,具体代码如下~:
public delegate void MyInvoke(string str);
private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
// = false;
Thread t = new Thread(new ThreadStart(fun));
t.Start();
}
private void fun()
{
//_myInvoke("dddd");
SetText("ddd");
}
private void SetText(string s)
{
if (textBox6.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(SetText);
this.Invoke(_myInvoke, new object[] { s });
}
else
{
this.textBox6.Text = s;
}
}
⑹ c# 跨线程访问控件
我最近刚好在弄多线程采集,用委托解决
(stringtest);
publicvoidSetDtText(stringtext)
{
if(list_dt.InvokeRequired)
{
CjDbCallBackd=newCjDbCallBack(SetDtText);
this.Invoke(d,newobject[]{text});
}
else
{
list_dt.Items.Insert(0,text);
}
}
list_dt控件名
然后到处用就行了
⑺ C#跨线程调用控件,怎么用invoke返回值
获取控件的值需要用invoke方法吗?需要的话就用委托吧,不需要的话就直接获取控件的值
⑻ C++ MFC跨线程调用控件会出问题吗
线程调用函数是可以的.
不过需要注意,跨线程调用的函数中,如果使用了全局变量或者静态局部变量, 或者动态申请的资源.
或者在该函数调用的函数中使用了这类资源
那么会出现线程不安全现象,需要加锁.
⑼ c#中如何跨线程调用windows控件
在辅助线程调用(在创建辅助线程时可将此方法通过delegate传到辅助线程中)下面的方法InvokeControl();
//写在主线程中(windows控件)
private void InvokeControl()
{
if (this.InvokeRequired)
this.Invoke(new DelegateChangeText(ChangeText));
else
this.ChangeText();
}
private void ChangeText()
{
this.TextBox.Text = "sd";
}
public delegate void DelegateChangeText();