Winforms:循环期间刷新

时间:2013-01-21 17:21:04

标签: c# winforms multithreading loops

我正在循环遍历包含X记录的excel文件中的c#读取数据集。出于测试目的,我使用Thread.Sleep()在读取每条记录后暂停输出一秒钟。我的理解是他们编写循环的方式,它应该暂停1秒然后显示1行输出(1条记录),暂停1秒,显示1行等等...但是,当我执行代码时,我得到一个X秒的长暂停,然后立即输出到屏幕的所有记录。任何人都知道为什么会这样吗?我插入一个断点并逐步完成它,一切似乎都运行正常(没有错误或任何东西)。对不起,如果这是一个基本问题,但我是一个绿色程序员。

private void ReadExcelFile()
    {
        string fileAndPath = fileTextBox.Text;
        string fileName = Path.GetFileName(fileAndPath);
        string directoryPath = Path.GetDirectoryName(fileAndPath);

        var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileAndPath + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ;
        using (var conn = new OleDbConnection(connectionString))
        {
            conn.Open();

            var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";

                var adapter = new OleDbDataAdapter(cmd);
                var ds = new DataSet();
                adapter.Fill(ds);

                foreach (DataRow row in ds.Tables[0].Rows)
                {
                    user = row.ItemArray[0].ToString();
                    email = row.ItemArray[1].ToString();
                    password = row.ItemArray[2].ToString();
                    Thread.Sleep(1000);                   

                    excelTextBox.Text += user + "     " + email + "     " + password + "     " + Environment.NewLine;
                }                    
            }
        }
    } 

1 个答案:

答案 0 :(得分:3)

由于您在主线程(UI的线程)上运行此方法,因此该线程无法处理事件(例如显示更新)。

您可以执行与此类似的操作来处理UI消息: https://stackoverflow.com/a/3121934/38368

或者,更好的是,重新设计代码。例如。使用单独的线程。例如。 https://stackoverflow.com/a/1216799/38368