【问题标题】:Backgroundworker exits after first expressionBackgroundworker 在第一个表达式后退出
【发布时间】:2015-12-07 07:16:09
【问题描述】:

我有一个绑定到 ObservableCollection 的列表视图。有了它,我想用 WPF gui 模拟一个聊天应用程序。 为了模拟一些活动,我想使用一个有点垃圾邮件的后台工作人员。但是工人在执行第一个语句后总是退出他的循环,所以我的问题是:他为什么这样做以及如何解决它?
这是到目前为止的代码:

  public partial class MainWindow : Window, INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion

    private string pCurrentUsername;
    public string currentUsername
    {
        get { return pCurrentUsername; }
        set
        {
            pCurrentUsername = value;
            if (null != this.PropertyChanged)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("currentUsername"));
            }
        }
    }

    ObservableCollection<ChatPost> items = new ObservableCollection<ChatPost>();
    BackgroundWorker bgWorker = new BackgroundWorker();

    public MainWindow()
    {
        InitializeComponent();
        currentUsername = "Me";
        items.Add(new ChatPost("this", "that"));

        bgWorker.DoWork += new DoWorkEventHandler(mockBussiness);
        bgWorker.RunWorkerAsync();
        lvChat.ItemsSource = items;

    }

    private void mockBusiness(object o, DoWorkEventArgs args)
    {
        while (!bgWorker.CancellationPending)
        {  
            items.Add(new ChatPost("guy1", "Ey man!"));
            items.Add(new ChatPost("guy2", "What man?"));
        }

    }


    private void btSend_Click(object sender, RoutedEventArgs e)
    {
        items.Add(new ChatPost(currentUsername, tbMessage.Text));
    }
}

public class ChatPost
{
    public ChatPost()
    { }
    public ChatPost(string username, string message)
    { 
        this.username = username;
        this.message = message;
    }
    public string username { get; set; }
    public string message { get; set; }
}

所以唯一被执行(意味着打印)的是一次“Ey man!”

【问题讨论】:

  • 如果您能解释一下这是什么类型的应用程序会有所帮助... WPF? Windows UAP?还有什么?
  • 抱歉 wpf,将其添加到问题中

标签: c# backgroundworker


【解决方案1】:

是的,您正在非 UI 线程上修改 UI(间接地,通过 ObservableCollection&lt;&gt;)。你不被允许这样做。我怀疑您应该找到一个提供该详细信息的异常,尽管它可能不容易找到。

一般来说,您需要将任何线程操作编组回 UI 线程。如果您在 .NET 4.5 上使用 WPF,显然您可以为此使用 BindingOperations.EnableCollectionSynchronization,但我承认我对此没有直接经验。

【讨论】:

  • 最好使用 List 而不是 ObservableCollection 因为 ObservableCollection 总是通过 CollectionChanged 事件向 UI 线程抛出数据?
  • @StepUp: 不,问题是ObservableCollection&lt;T&gt; 不会 在 UI 线程上引发事件...但 List&lt;T&gt; 不会引发事件一点也不。我认为使用BindingOperations.EnableCollectionSynchronization 是一种更好的方法。
猜你喜欢
  • 2021-12-06
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多