当前位置:首页 » 密码管理 » c线程访问控件

c线程访问控件

发布时间: 2025-05-28 04:38:43

1. c# 多线程 新开子线程中暂停,调用主线程控件,如何防止UI阻塞

1.新开的线程是无法直接访问UI控件的,如果需要访问,可以通过控件的Invoke方法,或者用
System.Threading.SynchronizationContext.Current.Post方法
2.一定不要在控件的内部事件处理方法里面使用Sleep等线程暂停方法!
像我这样写就不会阻塞了:
private void button1_Click(object sender, EventArgs e){System.Threading.Thread thread = new System.Threading.Thread(() ={while (true){this.Invoke(new Action(() ={label1.Text = (count++).ToString();}));System.Threading.Thread.Sleep(100);}});thread.IsBackground = true;
thread.Start();}你把setmess这个线程方法Invoke到了UI的主线程上了,而这个线程里面有暂停方法,所以呢主线程也会暂停卡住。
而我的方法只是把“label1.Text = (count++).ToString();”Invoke到主线程,而那个新的线程并没有Invoke到主线程,所以在那个线程里面使用暂停就没事了!
假如有一个操作比较费时,或者需要等待之类的,就像我这样开始一个新的线程,所以的等待操作,费时的操作都在在这个线程里面做,当这些线程需要访问UI控件的时候,就用this.Invoke()这个方法!

2. C# 子线程访问主窗体控件

是的,
在其他线程里,不允许调用主线程创建的控件~!!!!
这样做,是不安全的,因此,2.0屏蔽了这个~

楼上说的很对,用委托,具体代码如下~:
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;
}
}

3. 线程间操作无效,显示:从不是创建控件"Form1"的线程访问它,是什么原因

背景:
winform(vs2010)前台界面上有2个group(group1,group2),
每个group上面有一些lable用于显示后台查询出来的数据,后台3个线程A,B,C
A线程每隔几秒查询数据库,并把查询出来的数据更新到group1上的lable上(定义),
B线程每隔几秒查询数据库,并把查询出来的数据更新到group2上的lable上,通过一个辅助线程计算出的一个值赋给textBox1.text;

1.直接在窗体的构造函数中添加:

System.Windows.Forms.Control. = false;

此时禁用了所有的控件合法性检查。

2.通过代理来解决(msdn)

private delegate void SetTextCallback(string text); //在给textBox1.text赋值的地方调用以下方法即可 private void SetText(string text) { // InvokeRequired需要比较调用线程ID和创建线程ID // 如果它们不相同则返回true if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }

这里主要用到了.NET中的 delegate。

另外如果线程AB只负责将数据保存在全局变量里,用一个有操作权限的C(主界面搞个timer)调用这些数据并显示在界面上就没问题了。

4. C#多线程问题:线程间操作无效: 从不是创建控件“label4”的线程访问它。

一楼正解

你是写在GuidProc这个类里面的,这个是不行的.必须写在Form的类中或者子类中.就是说:this.Invoke中的this必须指的是一个窗体对象.

补充:
原因:声明的委托需要参数.
private delegate void SetTextDelegate(string value);

解决:修改代码.

if (this.InvokeRequired)
{
SetLabelText d = new SetLabelText(SetLabel1);
object arg = (object)要传入的参数值
this.Invoke(d,arg);//这里参数不对。
}

5. 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();

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:645
制作脚本网站 发布:2025-10-20 08:17:34 浏览:936
python中的init方法 发布:2025-10-20 08:17:33 浏览:632
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:821
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:731
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1066
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:299
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:160
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:851
python股票数据获取 发布:2025-10-20 07:39:44 浏览:763