[英]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-每次计时器间隔结束时,我都会清除数据。
在尝试更新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.