我收到此错误消息“ContextSwitchDeadlock”

I am getting this error message `ContextSwitchDeadlock`

我正在尝试读取 "csv file",然后将其数据保存到 employee 记录中,然后将此记录添加到 list,然后将列表添加到 data table,最后在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;
    }
}

首先你得看看你在做什么,你到底想做什么。

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

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

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

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

  • 您没有在您创建的列表中插入 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中的调试助手,是调试器在调试应用程序时提供的工具。我不确定它在提出这个问题之前检查的条件。但请注意,它不是 异常 ,它只是 visual studio 提醒您它正在等待 60 秒。如果这能解决问题,请告诉我。