在v1.3.0版本的netMarketing类库中,dataSetHelper类已经做了多线程安全性的处理。
对于在多线程下绑定dataTable到dataGridView控件时出现的错误(见下图1),这一版已经做了处理。
(图1)
详细的解决办法请参考下面的演示程序。
其关键的是使用returnDataTableCopy()函数返回表的拷贝,而不是直接使用returnDataTable()返回表对象。
myDataGridView1.DataSource = null; myDataGridView1.DataSource = set.returnDataTableCopy(0);
using sharClass; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { dataSetHelper set = new dataSetHelper("set1"); List<student> data = new List<student>(); Thread t1,t2,t3,t4,t5; public Form1() { InitializeComponent(); set.createTable("tab1", "name,age,workAge", "string,int,int"); //this.myDataGridView1.DataError += myDataGridView1_DataError; for (int i = 0; i < 10; i++) { addNew(); } t1 = new Thread(new ThreadStart(fun1)); t1.IsBackground = true; t2 = new Thread(new ThreadStart(fun2)); t2.IsBackground = true; t3 = new Thread(new ThreadStart(fun3)); t3.IsBackground = true; t4 = new Thread(new ThreadStart(fun4)); t4.IsBackground = true; t5 = new Thread(new ThreadStart(fun5)); t5.IsBackground = true; } //void myDataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) //{ //} private void Form1_Load(object sender, EventArgs e) { } private void timer1_Tick(object sender, EventArgs e) { myDataGridView1.DataSource = null; myDataGridView1.DataSource = set.returnDataTableCopy(0); addNew(); } private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; timer1.Start(); timer2.Enabled = true; timer2.Start(); t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start(); } private void addNew() { try { var data = new List<object>(){ randomHelper.GenerateRndNumLetter(8), randomHelper.GetRandomInt(11, 55),randomHelper.GetRandomInt(5555, 9999) }; set.appendRowData("tab1", data); } catch(Exception ex) { } } private void removeOneRow() { try { var tab = set.ReturnDataTable(0); if (tab.Rows.Count > 2) set.delRow("tab1", randomHelper.GetRandomInt(0, tab.Rows.Count - 1)); } catch(Exception ex) { //MessageBox.Show(ex.Message); } } private void timer2_Tick(object sender, EventArgs e) { addNew(); } private void fun1() { while(true) { if (randomHelper.GetRandomInt(1, 100) % 2 == 0) removeOneRow(); else addNew(); Thread.Sleep(200); } } private void fun2() { while (true) { if (randomHelper.GetRandomInt(1, 100) % 2 == 0) removeOneRow(); else addNew(); Thread.Sleep(200); } } private void fun3() { while (true) { if (randomHelper.GetRandomInt(1, 100) % 2 == 0) removeOneRow(); else addNew(); Thread.Sleep(200); } } private void fun4() { while (true) { if (randomHelper.GetRandomInt(1, 100) % 2 == 0) removeOneRow(); else addNew(); Thread.Sleep(200); } } private void fun5() { while (true) { if (randomHelper.GetRandomInt(1, 100) % 2 == 0) removeOneRow(); else addNew(); Thread.Sleep(200); } } } public class student { public string name { get; set; } public int age { get; set; } public int workAge { get; set; } } }
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


