我收到此错误消息`ContextSwitchDeadlock`

时间:2019-08-15 03:32:13

标签: c# contextswitchdeadlock

我正在尝试读取“ csv文件”,然后将其数据保存到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;
    }
}

1 个答案:

答案 0 :(得分: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中的 Debugging Assistant ,并且是调试器在调试应用程序时提供的工具。在提出这一要求之前,我不确定它所检查的条件。但是请注意,它不是 exception ,它只是视觉工作室,提醒您它正在等待60秒。让我知道这是否解决了问题。