跨线程操作无效:Control' dataGridView1'从创建它的线程以外的线程访问

时间:2016-08-13 12:49:08

标签: c# multithreading

我有一个Windows表单,它将把数据加载到我的datagridview中。

我在这一行中不断收到错误:

    dataGridView1.Rows.Add(row);

跨线程操作无效:控制' dataGridView1'从创建它的线程以外的线程访问。

这是我的代码:

    public List<string> _checked = new List<string>();

    private void getBarcodProperty()
    {                
        string query = "select Name from RfidUnic where Barcode = @barcode";

        while (true)
        {
            while (_checked.Count > 0)
            {
                SQLiteCommand cmd = new SQLiteCommand(query, sqliteConnection);
                cmd.Parameters.AddWithValue("@barcode", _checked[0]);
                sqliteConnection.Open();

                SQLiteDataReader da = cmd.ExecuteReader();

                if (da.Read())
                {
                    if (!da.IsDBNull(0))
                    {
                        string[] row = new string[] { da[0].ToString(), "1", _checked[0] };
                        dataGridView1.Rows.Add(row);
                        _checked.RemoveAt(0);
                    }
                }
                else
                {
                    string[] row = new string[] { "empty", "1", _checked[0] };
                    dataGridView1.Rows.Add(row);
                    _checked.RemoveAt(0);
                }

                sqliteConnection.Close();
            }
        }
    }

请告诉我出错的地方

由于

2 个答案:

答案 0 :(得分:8)

您的“getBarcodProperty”函数是从另一个线程而不是从UI线程调用的,您尝试在该方法中访问datagridview,因此它会产生问题。

有两种方法解决问题。

  1. 在您的加载方法“RFID_Load(object sender,EventArgs e)”中将此行添加为第一行。 (在这种情况下,您不必更改任何代码)
  2.   

    Control.CheckForIllegalCrossThreadCalls = false;

    更多细节:http://dotnetstep.blogspot.in/2009/09/cross-thread-operation-not-valid.html

    1. 另一种解决方案是使用委托。
    2.   

      dataGridView1.Invoke(new Action(()=&gt;               {                   dataGridView1.Rows.Add(行);               }));

      注意:对于每次通话,您必须做同样的事情。

答案 1 :(得分:3)

试试这个:

dataGridView1.Invoke(new Action(() => dataGrideView1.Rows.Add(row)));

但是在wpf的情况下,你必须使用调度员:Change WPF controls from a non-main thread using Dispatcher.Invoke;