0

我正在尝试读取“csv 文件”,然后将其数据保存到employee记录中,然后将此记录添加到 alist中,然后将列表添加到 a 中data table,最后在 a 中显示数据表内容datagridview。我似乎无法弄清楚我是否正在运行无限循环或问题可能是什么。程序运行 1 分钟,然后抛出错误ContextSwitchDeadlock

private void searchButton_Click(object sender, EventArgs e)
{
    string headerLine = reader.ReadLine();
    openFileDialog1.ShowDialog();
    searchValue.Text = openFileDialog1.FileName;

    using (StreamReader reader = new StreamReader(openFileDialog1.FileName))
    {        
        var line = reader.ReadLine();
        var value = line.Split(',');

        while(!reader.EndOfStream)
        {
            List<Employee> employeeList = new List<Employee>();
            var newEmployee = new Employee();

            newEmployee.firstName = value[0];
            newEmployee.lastName = value[1];
            newEmployee.address = value[2];
            newEmployee.age = value[3];
            newEmployee.monthlyGrossIncome = value[4];
            newEmployee.departmentId = value[5];
            newEmployee.developerType = value[6];
            newEmployee.taxType = value[7];

        }
        DataTable dataTable = new DataTable();
        dataTable.Columns.Add(headerLine);
        employeeDataGridView.DataSource = dataTable;
    }
}
4

1 回答 1

0

首先,您必须了解自己在做什么,以及您实际上想做什么。

  • var line = reader.ReadLine(); var value = line.Split(',');

    这两行应该在while loop. 因此,您实际上是在逐行读取csv文件的所有内容。现在它只迭代一行。

  • List<Employee> employeeList = new List<Employee>();

    您不是为所有员工制作一个列表,而是new list在每次迭代中创建一个while loop.

  • 您没有employee在您创建的列表中插入对象。

好吧,我不是 100% 确定解决所有这些问题会解决您系统上的问题,但我已经在我的机器上创建了一个像这样的虚拟项目并且它正在工作。

正确代码:

private void searchButton_Click(object sender, EventArgs e)
{
    string headerLine = reader.ReadLine();
    openFileDialog1.ShowDialog();
    searchValue.Text = openFileDialog1.FileName;

    using (StreamReader reader = new StreamReader(openFileDialog1.FileName))
    {        
        List<Employee> employeeList = new List<Employee>();
        while(!reader.EndOfStream)
        {
            var value = reader.ReadLine().Split(',');
            var newEmployee = new Employee
            {
                firstName = value[0],
                lastName = value[1],
                address = value[2],
                age = value[3],
                monthlyGrossIncome = value[4],
                departmentId = value[5],
                developerType = value[6],
                taxType = value[7]
            };
            employeeList.Insert(newEmployee);   
        }
        DataTable dataTable = new DataTable();
        dataTable.Columns.Add(headerLine);
        employeeDataGridView.DataSource = dataTable;
    }
}

现在,ContexSwitchDeadlock它是 Visual Studio 中的调试助手,是调试器在调试应用程序时提供的工具。我不确定它在提出这个问题之前检查的条件。但请注意,这不是一个例外,它只是视觉工作室提醒您它正在等待 60 秒。如果这能解决问题,请告诉我。

于 2019-08-15T07:50:00.260 回答