当前位置:首页 » 密码管理 » 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();

热点内容
arch搭建dhcp服务器 发布:2025-08-18 05:50:07 浏览:16
php游戏后台 发布:2025-08-18 05:34:05 浏览:63
安卓手机怎么看不了电池健康值 发布:2025-08-18 05:27:48 浏览:301
php表格显示数据库数据 发布:2025-08-18 05:20:44 浏览:722
提供固定ip的云服务器 发布:2025-08-18 05:14:25 浏览:748
codeblockslinux编译 发布:2025-08-18 05:14:24 浏览:678
编译程序比较复杂所以执行率高 发布:2025-08-18 05:13:50 浏览:174
计算机软件编程 发布:2025-08-18 05:13:50 浏览:701
vcenter搭建域服务器 发布:2025-08-18 05:08:49 浏览:513
serv文件怎么上传服务器 发布:2025-08-18 05:07:16 浏览:59