关于作者

.NET中访问不同线程UI元素解决方法

上一篇 / 下一篇  2008-05-17 10:12:05 / 个人分类:.net

在线程中是不能直接访问UI控件,但是有时候又确实要访问,这对于初学者来说可能有些困难,现就简单的说明一下方法,希望有所帮助。
比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..
实现:

using System.Threading;

//启动一个线程
Thread thread=new Thread(new ThreadStart(updateText));
thread.Start();

//线程方法
private void updateText()
{
      //将界面的TextBox内容设置一下
    this.TextBox1.Text="Hello Word";
}

如果你像上面操作,在.Net 2.0里是会有异常的,会提示访问不本线程的控件。
正确的做法是用Invoke..
改为如下:

//定义一个委托
public delegate void MyInvoke(string str);
//更新界面的方法
private void UpdateTextBox(string str);
{
     //更新
     this.TextBox1.Text=str;
}

//启动一个线程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();

//线程方法
private void DoWork()
{
    //其他操作
    //比如将界面的TextBox内容设置一下
     MyInvoke mi=new MyInvoke(UpdateTextBox);
    this.BeginInvoke(mi,new object[]...{"我是一个文本框"});
}

如果是.Net 3.0或者3.5的话,还可以通过另一个方法
比如启动一个Timer线程在窗体的Image上画拆线

delegate void doDrawing();

Timer timer = new Timer();

timer.Interval = 1000;
timer.Elapsed += new ElapsedEventHandler(StartDrawing);

timer.Start();

private void StartDrawing(object o,ElapsedEventArgs e)
{
       //访问不同线程UI
       if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
       {
            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,new doDrawing(Draw));
       }
}

//画折线图
private void Draw()
{

       //do your drawing

}

TAG: 多线程

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)