发布网友 发布时间:2022-04-23 03:03
共4个回答
热心网友 时间:2023-06-30 23:57
在.NET中,为了线程调用安全,其他线程是不能访问UI线程中的控件的
需要写一个委托,回挂到UI线程中去
//要使用Invoke必须要传递一个委托 所以 先定义一个委托
private delegate void UIInvokeHandler (int i);
private void button1_Click(object sender, EventArgs e) //按钮单击事件
{
int num;
if(Int32.TryParase(TextBox.text,out num))
{
output(num); 这里跨线程调用控件
}
}
//任何时候要调用窗体控件时调用这个函数,而不是下面那个protected void atry(int n)
//这个函数可以根据你的调用是否跨线程的而进行相应的处理
protected void output(int n) 这个函数是关键
{
if(this.IvokeRequired) //根据这个标志判断是否需要跨线程
{ //是跨线程调用则用Invoke的方式,在创建的线程内执行
UIInvokeHandler deloutput = new UIInvokeHandler (atry);
//在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托
this.Invoke(deloutput,n); //如果有多个参数,则用一个object数组
}
else
{
//如果不是跨线程调用,则直接访问
atry(n);
}
}
//真正的事件处理方法,委托的实际执行函数
protected void atry(object m)
{ int n = (int)m;
richTextBox1.Clear();
for(int i = 1; i<= n; ++i)
richTextBox1.Clear();.AppendText(i.ToString);
}
几点说明:
public bool InvokeRequired { get; }
System.Windows.Forms.Control 的成员
获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中
如果控件的 System.Windows.Forms.Control.Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。
热心网友 时间:2023-06-30 23:57
不是在调试模式下使用时,是不会提示错误的,但是这不是线程安全的,你当然可以用锁的方式来保证安全,但是不推荐。
推荐用delegate来ui代理调用,这样是安全的。
______________________________
具体就是
声明原型
delegate void Worker();
void Work();
定义
Worker worker=new Worker(form1.Work);
使用
worker.Invoke(params);
____________________________
热心网友 时间:2023-06-30 23:58
td = new Thread(new ThreadStart(progprocess));
td.Start();
这个线程不是UI线程自然不能更改UI的东西了。
你的Invoke一下UI线程来操作。
热心网友 时间:2023-06-30 23:58
最近很多人问多线程的问题,
http://zhidao.baidu.com/question/79980016.html
http://zhidao.baidu.com/question/80234484.html
中有我为这类相关问题写的例子.敬请参考.