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();}));
来源: http://www.bubuko.com/infodetail-3023953.html