Backgroundworker在第一个表达式后退出

本文关键字:退出 表达式 第一个 Backgroundworker | 更新日期: 2023-09-27 18:25:59

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

  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!"

Backgroundworker在第一个表达式后退出

是的,您正在非UI线程上修改UI(通过ObservableCollection<>间接修改)。你不能那样做。我怀疑你应该找到一个给出细节的异常,尽管这可能不容易找到。

通常,您需要将任何线程操作封送回UI线程。如果你在.NET 4.5上使用WPF,显然你可以使用BindingOperations.EnableCollectionSynchronization,但我承认我对此没有直接的经验。