WPF不同线程之间的控件是不同访问的,为了能够访问其他线程之间的控件,需要用Dispatcher.Invoke执行一个新的活动即可。
例如:
public void SetNotes(string notes) { if (Dispatcher.Thread != Thread.CurrentThread) { this.txtNote.Dispatcher.Invoke(new Action(() => { 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(new Action(() => { AddText(); })); this.Dispatcher.Invoke(new Action(() => { AddText(); })); Application.Current.Dispatcher.Invoke(new Action(delegate { AddText();}));