Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的实时更新#_C#_Multithreading_Datagridview - Fatal编程技术网

C# C语言中的实时更新#

C# C语言中的实时更新#,c#,multithreading,datagridview,C#,Multithreading,Datagridview,因此,我有一个需要实时更新的数据网格视图,用于管理软件。我试图在单独的线程上更新控件,但它引发了一个异常: Cross-thread operation not valid: Control 'dataGridView1' accessed from a thread other than the thread it was created on. 代码如下: public void atualiza() { for (int i = 0; ; i++)

因此,我有一个需要实时更新的数据网格视图,用于管理软件。我试图在单独的线程上更新控件,但它引发了一个异常:

Cross-thread operation not valid: Control 'dataGridView1' accessed from a thread other than the thread it was created on.
代码如下:

public void atualiza()
        {
            for (int i = 0; ; i++)
            {
                i--;
                tabela();
                System.Threading.Thread.Sleep(90000);
            }
        }

private void mainUser_Load(object sender, EventArgs e)
    {
        atualizaTabela t = new atualizaTabela(atualiza);
        t.BeginInvoke(null, null);
    }
“Tabela”是实际更新数据网格视图的方法:

public void tabela()
        {
            string comando = "SELECT * FROM Job";
            OracleDataAdapter da;
            OracleCommand comm;
            DataSet ds;
            OracleConnection Conn = new OracleConnection(dbstring);
            comm = new OracleCommand(comando, Conn);
            da = new OracleDataAdapter(comm);
            ds = new DataSet();
            da.Fill(ds, "Job");
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "Job";
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            dataGridView1.Columns[0].HeaderText = "Id";
            dataGridView1.Columns[1].HeaderText = "Produto";
            dataGridView1.Columns[2].HeaderText = "Cliente";
            dataGridView1.Columns[3].HeaderText = "Data de Pedido";
            dataGridView1.Columns[4].HeaderText = "Previsão de Entrega";
            dataGridView1.Columns[5].HeaderText = "Preço";
            dataGridView1.Columns[6].HeaderText = "Tamanho";
            dataGridView1.Columns[7].HeaderText = "Quantidade";
            dataGridView1.Columns[8].HeaderText = "Comentário";
        }

“Atalizatabela”是一个代表。当我尝试将datagridview绑定到数据源时引发异常:
(dataGridView1.datasource=ds)

由于异常状态,您无法从非UI线程访问UI元素

我建议使用
后台工作人员
。你可以

以下是您需要完成的基本概述:

  • 这似乎是
    WinForms
    ,因此将
    BackgroundWorker
    放到
    表单上
  • WorkerReportsProgress
    属性设置为
    True
  • 订阅
    DoWork
    ProgressChanged
    事件
  • 从数据库中获取数据,在
    DoWork
    事件中,该事件位于单独的线程中
  • 通过调用
    ReportProgress
    将数据传递给
    ProgressChanged
    事件
  • 使用发生在UI线程上的
    ProgressChanged
    事件中的数据更新网格,这样就不会出现“跨线程操作”异常

UI控件通常只能在创建它们的线程上进行操作。要避免此错误,请使用名为Invoke()的方法,该方法可以从单独的线程调用,以便在控件的创建线程上运行代码。因此,在tabela()函数检索ds中的数据后,可以执行以下操作:

        dataGridView1.Invoke(new Action(() =>
            {
                dataGridView1.DataSource = ds;
                dataGridView1.DataMember = "Job";
                ...
            }));
        };

谢谢你,好心的先生!这对我帮助很大:)