后台辅助角色中的集合处理



我尝试使连接到ObservaleCollection的ListBox更有效率,因此对于数据库查询,我实现了一个BackgroundWorker 来完成这项工作。然后,我想将每个 70 毫秒 3 个条目添加到 UI 中,这样大量条目(假设 100 个)上的 UI 就不会被阻止。这是代码:

    void updateTMWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var MessagesInDB = from MessageViewModel tm in MessagesDB.Messages
                                  where tm.Type.Equals(_type)
                                  orderby tm.Distance
                                  select tm;
        // Execute the query and place the results into a collection.
        Dispatcher.BeginInvoke(() => { MessagesClass.Instance.Messages = new ObservableCollection<MessageViewModel>(); });
        Collection<MessageViewModel> tempM = new Collection<MessageViewModel>();
        int tempCounter = 0;
        foreach (MessageViewModel mToAdd in MessagesInDB)
        {
            if (MessagesClass.Instance.Messages.IndexOf(mToAdd) == -1)
            {
                tempM.Add(mToAdd);
                tempCounter = tempCounter + 1;
            }
            if (tempCounter % 3 == 0)
            {
                tempCounter = 0;
                Debug.WriteLine("SIZE OF TEMP:" + tempM.Count());
                Dispatcher.BeginInvoke(() =>
                {
                    // add 3  messages at once
                    MessagesClass.Instance.Messages.Add(tempM[0]);
                    MessagesClass.Instance.Messages.Add(tempM[1]);
                    MessagesClass.Instance.Messages.Add(tempM[2]);
                });
                tempM = new Collection<MessageViewModel>();
                Thread.Sleep(70);
            } 
        }
        // finish off the rest
        Dispatcher.BeginInvoke(() =>
        {
            for (int i = 0; i < tempM.Count(); i++)
            {
                MessagesClass.Instance.Messages.Add(tempM[i]);
            }
        });            
    }

输出为:

SIZE OF TEMP:3
A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll

在行中:MessagesClass.Instance.Messages.Add(tempM[0]);代码尝试访问tempM的第一个元素

任何提示有什么问题吗?为什么我无法访问 tempM 元素,尽管集合大小> 0?

您忘记了线程同步。查看您的代码:

            1: Debug.WriteLine("SIZE OF TEMP:" + tempM.Count());
            Dispatcher.BeginInvoke(() =>
            {
                // add 3  messages at once
                3: MessagesClass.Instance.Messages.Add(tempM[0]);
                MessagesClass.Instance.Messages.Add(tempM[1]);
                MessagesClass.Instance.Messages.Add(tempM[2]);
            });
            2: tempM = new Collection<MessageViewModel>();

执行MessagesClass.Instance.Messages.Add(tempM[0]);时,tempM已经null。因此,请使用某些排序或同步对象,例如:

            EventWaitHandle Wait = new AutoResetEvent(false);
            Debug.WriteLine("SIZE OF TEMP:" + tempM.Count());
            Dispatcher.BeginInvoke(() =>
            {
                // add 3  messages at once
                MessagesClass.Instance.Messages.Add(tempM[0]);
                MessagesClass.Instance.Messages.Add(tempM[1]);
                MessagesClass.Instance.Messages.Add(tempM[2]);
                Wait.Set();
            });
            // wait while tempM is not in use anymore
            Wait.WaitOne();
            tempM = new Collection<MessageViewModel>();

相关内容

  • 没有找到相关文章

最新更新