C#委托叫了两次?

时间:2016-05-30 19:28:54

标签: c# prism prism-5

我创建了一个输出窗口,使用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

OR

===== SetText =====
->CheckAccess > true

但似乎被叫了两次。

1 个答案:

答案 0 :(得分:1)

您可以通过ThreadOption.UIThread这样传递

来订阅UI线程
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true);

甚至更简单,绑定到您的viewmodel上的属性并且您已完成,因为INotifyPropertyChanged事件会自动编组到UI线程。