Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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#_Data Binding_Multithreading - Fatal编程技术网

C# 交叉线程问题

C# 交叉线程问题,c#,data-binding,multithreading,C#,Data Binding,Multithreading,我有一个按钮和下面的代码 new Thread(() => { DataTable table = Finish(txtTest.Text); //dgwTest.DataSource = table }).Start(); 我想设置datagridview数据源,但我得到一个“交叉线程”异常。有人知道如何避免这种情况吗?您需要在DataGridView private delegate void SetDGVValueDeleg

我有一个按钮和下面的代码

    new Thread(() =>
    {
        DataTable table = Finish(txtTest.Text);
        //dgwTest.DataSource = table

    }).Start();

我想设置datagridview数据源,但我得到一个“交叉线程”异常。有人知道如何避免这种情况吗?

您需要在
DataGridView

private delegate void SetDGVValueDelegate(DataTable table);

private void button1_Click(object sender, EventArgs e)
{
    new Thread(() =>    {        
        DataTable table = Finish(txtTest.Text);

        SetDGVValue(table);

    }).Start();

}

private void SetDGVValue(DataTable table) 
{ 
    if (dataGridView1.InvokeRequired) 
    { 
        dataGridView1.Invoke(new SetDGVValueDelegate(SetDGVValue), table); 
    } 
    else 
    { 
        dataGridView1.DataSource = table; 
    } 
}

您需要在
DataGridView

private delegate void SetDGVValueDelegate(DataTable table);

private void button1_Click(object sender, EventArgs e)
{
    new Thread(() =>    {        
        DataTable table = Finish(txtTest.Text);

        SetDGVValue(table);

    }).Start();

}

private void SetDGVValue(DataTable table) 
{ 
    if (dataGridView1.InvokeRequired) 
    { 
        dataGridView1.Invoke(new SetDGVValueDelegate(SetDGVValue), table); 
    } 
    else 
    { 
        dataGridView1.DataSource = table; 
    } 
}

字符串源=txtest.Text

new Thread(() =>
{
      DataTable table = Finish(source);
      dgwTest.Invoke ((Action) (() => dgwTest.DataSource = table));
}).Start(); 

字符串源=txtest.Text

new Thread(() =>
{
      DataTable table = Finish(source);
      dgwTest.Invoke ((Action) (() => dgwTest.DataSource = table));
}).Start(); 

我尝试过这段代码,但我的数据网格视图从未更新:(@Jack如果您从主ui线程调用方法SetDGVValue会发生什么?您是否尝试过使用调试器单步执行,检查DataTable是否正确填充?如果我在不使用新线程的情况下运行此代码,DataTable是否正确填充()…它运行良好,只是整个程序变得unresponsive@Jack-奇怪,在我的测试代码中,这很好。如果您尝试线程示例,并设置一个断点,那么在SetGDVValue方法中会发生什么?顺便说一句,您为什么不使用BackgroundWorker?我对线程知之甚少(阅读:我什么都不知道),我只是在网上读了一些教程来让它工作。我曾尝试使用后台工作者,但由于我没有任何经验,我遇到了更多的问题。我将尝试创建一个新项目,看看会发生什么,如果它对你有效,那么我做错了什么。Thxx寻求帮助:)我尝试过这段代码,但我的数据网格视图从未更新:(@Jack如果您从主ui线程调用方法SetDGVValue会发生什么?您是否尝试过使用调试器单步执行,检查DataTable是否正确填充?如果我在不使用新线程的情况下运行此代码,DataTable是否正确填充()…它运行良好,只是整个程序变得unresponsive@Jack-奇怪,在我的测试代码中,这很好。如果您尝试线程示例,并设置一个断点,那么在SetGDVValue方法中会发生什么?顺便说一句,您为什么不使用BackgroundWorker?我对线程知之甚少(阅读:我什么都不知道),我只是在网上读了一些教程来让它工作。我曾尝试使用后台工作者,但由于我没有任何经验,我遇到了更多的问题。我将尝试创建一个新项目,看看会发生什么,如果它对你有效,那么我做错了什么。Thxx寻求帮助:)嗯,我在使用此代码后遇到编译器错误,无法将lambda表达式转换为“System.Delegate”类型,因为它不是委托type@Jack-我刚刚编辑了@agent-j的代码-在lamba周围添加括号以允许强制转换。现在应该可以了。@David…谢谢。也许我应该使用委托语法…有时候很简单r、
.Invoke((操作)委托{MessageBox.Show(“”;});
Hmm使用此代码后出现编译器错误,无法将lambda表达式转换为类型“System.Delegate”,因为它不是委托type@Jack-我刚刚编辑了@agent-j的代码-在lamba周围添加括号以允许演员阵容发挥作用。现在应该可以了。@David…谢谢。也许我应该使用委托语法…有时是这样更简单。
.Invoke((操作)委托{MessageBox.Show(“”;});