C# 委托调用了两次?
C# delegate called twice?
我创建了一个输出 window,其中使用 Prism 的 EventAggregator
订阅了多个事件。到目前为止,构造函数正在处理两个不同的事件:
public OutputWindowView(IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<LoginStatusEvent>().Subscribe(trackLogin, true);
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, true);
this.InitializeComponent();
}
两个事件都通过 SetText
方法针对相同的 UI 组件:
private void trackLogin(LoginStatus s)
{
SetText("Connected: " + s.IsConnected.ToString());
}
private void trackMessage(string s)
{
SetText(s);
}
我正在尝试创建一个委托以避免线程错误。
private delegate void SetOutputText(string content);
private void SetText(string content)
{
Trace.WriteLine("===== SetText =====");
var text = content + Environment.NewLine;
if (this.txtOutput.Dispatcher.CheckAccess() == false)
{
Trace.WriteLine("->CheckAccess > false");
SetOutputText _output = new SetOutputText(SetText);
this.Dispatcher.Invoke(_output, text);
}
else
{
Trace.WriteLine("->CheckAccess > true");
this.txtOutput.Text += text;
}
}
悬停输出为:
===== SetText =====
->CheckAccess > false
===== SetText =====
->CheckAccess > true
我希望输出为:
===== SetText =====
->CheckAccess > false
或
===== SetText =====
->CheckAccess > true
不过好像调用了两次
您可以通过像这样传递 ThreadOption.UIThread
来订阅 UI 话题
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true);
或者更简单,绑定到视图模型上的 属性 就大功告成了,因为 INotifyPropertyChanged
事件会自动编组到 UI 线程。
我创建了一个输出 window,其中使用 Prism 的 EventAggregator
订阅了多个事件。到目前为止,构造函数正在处理两个不同的事件:
public OutputWindowView(IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<LoginStatusEvent>().Subscribe(trackLogin, true);
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, true);
this.InitializeComponent();
}
两个事件都通过 SetText
方法针对相同的 UI 组件:
private void trackLogin(LoginStatus s)
{
SetText("Connected: " + s.IsConnected.ToString());
}
private void trackMessage(string s)
{
SetText(s);
}
我正在尝试创建一个委托以避免线程错误。
private delegate void SetOutputText(string content);
private void SetText(string content)
{
Trace.WriteLine("===== SetText =====");
var text = content + Environment.NewLine;
if (this.txtOutput.Dispatcher.CheckAccess() == false)
{
Trace.WriteLine("->CheckAccess > false");
SetOutputText _output = new SetOutputText(SetText);
this.Dispatcher.Invoke(_output, text);
}
else
{
Trace.WriteLine("->CheckAccess > true");
this.txtOutput.Text += text;
}
}
悬停输出为:
===== SetText =====
->CheckAccess > false
===== SetText =====
->CheckAccess > true
我希望输出为:
===== SetText =====
->CheckAccess > false
或
===== SetText =====
->CheckAccess > true
不过好像调用了两次
您可以通过像这样传递 ThreadOption.UIThread
来订阅 UI 话题
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true);
或者更简单,绑定到视图模型上的 属性 就大功告成了,因为 INotifyPropertyChanged
事件会自动编组到 UI 线程。