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(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();}));
WPF中窗口控件的跨线程调用
在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可。 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没有权限,访问了会抛异常; 没有CheckForIllegalCrossThreadCalls 属性,怎么办? 在WPF中的窗口控件都有一个Dispatcher属性,允许访问控件的线程;既然不允许直接访问,就告诉控件我们要干什么就好了。 方法如下:
这里是要 输出一段字符串在TextBox中,只需要调用output方法就可以了。其它的处理同上! |