繁体   English   中英

C#.Net中的线程安全网格视图更新

[英]Thread Safe Grid View Update in C# .Net

我正在详细解释我的问题。 我在Windows主窗体中有一个dataGridView 我有一个计时器,当单击button1时该计时器开始计时。 当单击button2时,它停止。

现在,与此同时,我正在计算某些内容并将其放入dataGridView 这是一个动态计算。 在此计算中,我使用了线程。 (我绝对不是Threads的新手)。 我已经使用Thread.Sleep(100)来计算数据。 现在,我在循环中使用Thread.Sleep来计算连续事物的数据。 我希望保留计算的各个顺序。 循环的每次迭代后,我都使用dataGridView.Rows.AddRange(DataGridViewRow)添加带有计算出的新数据的新行。

但是我没有按顺序在dataGridView中获取数据,并且也无法正常运行。 它在某个时间变得空白,并且随机出现。

PS-每次计时器间隔结束时,我都会清除数据。

您只能从UI线程访问UI控件。

如果尝试从其他线程访问它们,则会发现未定义的行为。

我建议您先阅读这本免费电子书: Albahari

在尝试更新datagridview之前,您需要调用datagridview.InvokeRequired。 如果是这样,则调用Invoke传递您要执行的委托以及要传递的任何数据。

已解决。 实际上,您必须设置Thread.Sleep计时器,以使其在Windows.Forms.Timer的间隔结束之前完成。

这是设置Gridview的线程安全方法。

class Program
{
public static List<string> ChoiceExtension = new List<string>();
static void Main()
{
    ChoiceExtension.Add("One");
    ChoiceExtension.Add("Two");
    ChoiceExtension.Add("Three");
    //Set list as gridsource
    InserttoGrid(ChoiceExtension);

}

public static void SetDataSource(object value)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Path of Extension");
        foreach (var item in value as List<string>)
        {
            dt.Rows.Add(new object[] { item });

        }
        ExtensionList.DataSource = dt;
    }
public static void InserttoGrid(List<string> List)
    {
        if (ChoiceExtension.Count >0)
        {

            if (this.ExtensionList.InvokeRequired)
            {
               ExtensionList.Invoke(new SetDataSourceDelegate(SetDataSource), new Object[] { List });


            }
            else
            {
                SetDataSource(List);

            }

        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM