WPF不同线程之间的控件的访问

来源:互联网 发布:smartgit linux 安装 编辑:程序博客网 时间:2024/06/06 02:44

  

    WPF不同线程之间的控件是不同访问的,为了能够访问其他线程之间的控件,需要用Dispatcher.Invoke执行一个新的活动即可。

例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void SetNotes(string notes)
{
    if (Dispatcher.Thread != Thread.CurrentThread)
    {
        this.txtNote.Dispatcher.Invoke(newAction(() =>
        {
            this.txtNote.Text += notes;
            this.txtNote.Text +="\r";
            this.txtNote.ScrollToEnd();
        }));
    }
    else
    {
        this.txtNote.Text += notes;
        this.txtNote.Text +="\r";
        this.txtNote.ScrollToEnd();
    }
}

 WinForm中:

复制代码
private delegate void delegateCrossThread(string message);        private void SetStatus(string message)        {            if (this.m_StatusLabel.InvokeRequired == true)            {                delegateCrossThread ct = new delegateCrossThread(SetStatus);                this.Invoke(ct, new object[] { message });            }            else            {                this.m_StatusLabel.Text = message;                this.m_StatusLabel.Refresh();            }        }
复制代码

3、异步打开窗口

复制代码
            Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));            newWindowThread.SetApartmentState(ApartmentState.STA);            newWindowThread.Start();   private void ThreadStartingPoint()        {            SurveyStatWindow surveyStatDialog = new SurveyStatWindow();            if (m_StatDataTable != null)            {                surveyStatDialog.TimeData = m_StatDataTable;                surveyStatDialog.Init();            }            surveyStatDialog.ShowDialog();        }
复制代码

 4、全局异步调用

?
     Application.Current.Dispatcher.Invoke(newAction(() =>
     {
         AddText();
     }));
 
     this.Dispatcher.Invoke(newAction(() =>
     {
         AddText();
     }));
 
Application.Current.Dispatcher.Invoke(newAction(delegate{ AddText();}));








WPF中窗口控件的跨线程调用

在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可。

在WPF中要麻烦一下,同样的不允许跨线程访问,因为没有权限,访问了会抛异常;

没有CheckForIllegalCrossThreadCalls 属性,怎么办?

在WPF中的窗口控件都有一个Dispatcher属性,允许访问控件的线程;既然不允许直接访问,就告诉控件我们要干什么就好了。

方法如下:

复制代码
private delegate void outputDelegate(string msg); private void output(string msg) { this.txtMessage.Dispatcher.Invoke(new outputDelegate(outputAction), msg); } private void outputAction(string msg) { this.txtMessage.AppendText(msg); this.txtMessage.AppendText("\n"); }
复制代码

这里是要 输出一段字符串在TextBox中,只需要调用output方法就可以了。其它的处理同上!


阅读全文
0 0
原创粉丝点击