在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,转载请注明出处!讨论可扫码加群:



少有人走的路



















