C# 跨线程控件取值问题

future0723 2009-07-13 03:33:22
主要代码如下:
MyThread my = new MyThread(this);
thrs[i] = new Thread(new ThreadStart(TestUserLogin));
线程代码如下
void TestUserLogin()
{
Thread thisThread = Thread.CurrentThread;
try
{
g_uif.UserName = textUserName.Text.ToUpper();//无法取值
---------------------------------
小弟刚接触多线程,望各位大虾不吝赐教,感激涕零。
...全文
211 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jonas401 2009-07-14
  • 打赏
  • 举报
回复
纠正下,楼上 => 楼主
jonas401 2009-07-14
  • 打赏
  • 举报
回复
其实楼主在二楼列出的方法是解决问题的最根本方法,变通一下就可以用了,就是使用代理

关闭线程安全性检查是掩耳盗铃,迟早会出问题

解决方法:

public deleate String ReadControlTextHandle(Control control);
public String ReadControlText(Control control)
{
if (this.InvokeRequired)
{
this.Invoke(new ReadControlTextHandle(ReadControlText), control);
}
else
{
return control.Text;
}
}

直接调用:g_uif.UserName = ReadControlText(textUserName);

上面代码是随手写的,没测试过,楼上理解后自己测试吧
peterb 2009-07-13
  • 打赏
  • 举报
回复
shadow_2006 2009-07-13
  • 打赏
  • 举报
回复
BackgroundWork组件!
koko0123 2009-07-13
  • 打赏
  • 举报
回复
线程之间参数互掉,C#中有个方法的,具体的我忘记了,你可以上msdn上找、。
Simonzy 2009-07-13
  • 打赏
  • 举报
回复
通过参数传递过去,使用ParameterizedThreadStart委托。

MyThread my = new MyThread(this);
thrs[i] = new Thread(new ParameterizedThreadStart(TestUserLogin),textUserName.Text.ToUpper());
线程代码如下
void TestUserLogin(object state)
{
Thread thisThread = Thread.CurrentThread;
try
{
g_uif.UserName = string.Format("{0}",state);
菊花古剑和酒 2009-07-13
  • 打赏
  • 举报
回复
感觉代码有问题 但是不知道怎么写
future0723 2009-07-13
  • 打赏
  • 举报
回复
再顶。
暈哥 2009-07-13
  • 打赏
  • 举报
回复
CheckForIllegalCrossThreadCalls = false;

关闭线程安全性检查
future0723 2009-07-13
  • 打赏
  • 举报
回复
我自己顶
future0723 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dyshadow 的回复:]
textUserName
是一个控件,对么?多线程直接访问控件的话,会报线程安全性错误。一个方法是关闭线程安全性检查(不推荐),另一个方法是用代理来访问。

[/Quote]
表示感谢,但是能否做个最简单的例子,试试如何读取text,不要用网络上一堆堆的代码来copy。
如:
private delegate void AddTextUnSafe(string Text);
public void Addtext(string text)
{
if (this.richTextBox1.InvokeRequired)
{
AddTextUnSafe aus = new AddTextUnSafe(Addtext);
object obj = this.richTextBox1.BeginInvoke(aus, new string[] { text });
}
else
{
this.richTextBox1.AppendText(text + "\n");
}
}
dyshadow 2009-07-13
  • 打赏
  • 举报
回复
textUserName
是一个控件,对么?多线程直接访问控件的话,会报线程安全性错误。一个方法是关闭线程安全性检查(不推荐),另一个方法是用代理来访问。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧