【问题标题】:C# delegate called twice?C#委托调用了两次?
【发布时间】:2016-05-30 19:28:53
【问题描述】:

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

但它似乎被调用了两次。

【问题讨论】:

    标签: c# prism prism-5


    【解决方案1】:

    您可以像这样传递ThreadOption.UIThread 来订阅 UI 线程

    eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true);
    

    或者更简单,绑定到视图模型上的属性就完成了,因为INotifyPropertyChanged 事件会自动编组到 UI 线程。

    【讨论】:

    • 谢谢您,您能否详细说明关于竞标房产的第二点?我是 C# 新手。
    • 通常情况下,尤其是在 prism 的上下文中,您有一个以视图模型作为数据上下文的视图,并且该视图模型实现了INotifyPropertyChanged(通过从 prism 中的BindableBase 派生),而您可以从任何线程更改视图模型上的属性,并且视图将相应更新。我想这里的评论太多了,你最好在谷歌上搜索 wpf 数据绑定,mvvm,查看 prism 示例文档以了解这些概念。
    猜你喜欢
    • 2013-11-22
    • 2011-02-07
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多