mscorlib中的wpf listview argumentoutofrangeexception

时间:2014-07-06 07:39:31

标签: c# wpf listview exception

我在一个简单的wpf应用程序中有一个listview,它会抛出一个未处理的异常:http://www.picz.ge/img/s2/1407/6/4/4d2baa8909d8.png

mscorlib.dll中发生未处理的“System.ArgumentOutOfRangeException”类型异常  附加信息:指数超出范围。必须是非负面的  并且小于集合的大小。

我无法理解错误在哪里。 当我设置time=2000;代码工作正常; 这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;

namespace Wpftemp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Thread t;
        List<Something> listview_source;
        int time;
        public MainWindow()
        {
            InitializeComponent();
            listview_source = new List<Something>();
            listview.ItemsSource = listview_source;
            t = new Thread(f);
            time = 100;
            t.Start();
        }

        private void f()
        {
            while (true)
            {
                listview_source.Clear();
                refreshe_source();
                App.Current.Dispatcher.Invoke( delegate()
                {
                    listview.Items.Refresh();
                });
                Thread.Sleep(time);
            }
        }
        private void refreshe_source()
        {
            for (int i = 0; i < 150; i++)
            {
                 listview_source.Add(new Something(DateTime.Now.Second));
            }

        }

        struct Something
        {
           public Something(double i)
            {
                this.i = i;
            }
           double i;

           public double var
           {
               get { return i; }
               set { i = value; }
           }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为问题在于使用Dispatcher,因为dispatcher.Invoke()中的代码将在主线程准备执行后执行,所以当Dispatcher.Invoke()中的代码完全正确时,无法保证执行,所以当你增加时间值时,你保证代码已被执行。删除Dispatcher或增加值时间。