C# 如何使用线程来更改Gridview中的某些单元格?

C# 如何使用线程来更改Gridview中的某些单元格?,c#,gridview,multithreading,C#,Gridview,Multithreading,如何使用线程来更改Gridview中的某些单元格?我有一个来自数据库的查询,它使用了大量的时间进行查询。所以它非常慢,我想使用线程来更快地加载数据。此外,当线程完成其任务时,可以使用System.Threading更改网格视图中的数据; using System.Threading; using System.Threading.Tasks; public partial class Form1 : Form { public Form1() { Initial

如何使用线程来更改Gridview中的某些单元格?我有一个来自数据库的查询,它使用了大量的时间进行查询。所以它非常慢,我想使用线程来更快地加载数据。此外,当线程完成其任务时,可以使用System.Threading更改网格视图中的数据;
using System.Threading;
using System.Threading.Tasks;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        dataGridView1.DataSource = new List<Test>() { new Test { Name = "Original Value" } };
    }

    // Start the a new Task to avoid blocking the UI Thread
    private void button1_Click(object sender, EventArgs e)
    {
        Task.Factory.StartNew(this.UpdateGridView);
    }
    // Blocks the UI
    private void button2_Click(object sender, EventArgs e)
    {
        UpdateGridView();
    }

    private void UpdateGridView()
    {
        //Simulate long running operation
        Thread.Sleep(3000);
        Action del = () =>
            {
                dataGridView1.Rows[0].Cells[0].Value = "Updated value";
            };
        // If the caller is on a different thread than the one the control was created on
        // http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired%28v=vs.110%29.aspx
        if (dataGridView1.InvokeRequired)
        {
            dataGridView1.Invoke(del);
        }
        else
        {
            del();
        }
    }
}
使用System.Threading.Tasks; 公共部分类Form1:Form { 公共表格1() { 初始化组件(); dataGridView1.DataSource=new List(){new Test{Name=“Original Value”}; } //启动新任务以避免阻塞UI线程 私有无效按钮1\u单击(对象发送者,事件参数e) { Task.Factory.StartNew(this.UpdateGridView); } //阻止用户界面 私有无效按钮2\u单击(对象发送者,事件参数e) { UpdateGridView(); } 私有void UpdateGridView() { //模拟长时间运行 睡眠(3000); 动作del=()=> { dataGridView1.Rows[0]。单元格[0]。Value=“Updated Value”; }; //如果调用方位于与创建控件的线程不同的线程上 // http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired%28v=vs.110%29.aspx if(dataGridView1.InvokeRequired) { dataGridView1.Invoke(del); } 其他的 { del(); } } }
在填充网格时,问题是如何实现线程还是如何避免跨线程异常?请更具体一些。你不明白什么?