如题,列如:
DataSet myDs=new DataSet();
在上面这个DataSet里,我放了两个Table。
分别为:
myDs.Tables["a"] 和 myDs.Tables["b"]
这两个表,分别在不同线程中工作,
请教一下,会不会发生并发,
就是我在操作a表的同时,也在操作b表。这样可行吗?
还是得new两个DataSet?
我这个DataSet是个静态的,可能在很多线程里都要用,更新删除新增什么的,
如果说是会出现并发,那我就要声名多个静态DataSet,这样会不会出现资源的浪费以及影响性能及程序健壮性,
我写下如下代码测试,好像不会出现问题。暂且认为不会出现并发错误。。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace SocketServer { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DataSet myDs = new DataSet(); private Thread threadOne; private Thread threadTwo; private void Form1_Load(object sender, EventArgs e) { DataTable ta = new DataTable("ta"); ta.Columns.Add(groupColumn("cName", "System.String")); myDs.Tables.Add(ta); DataRow ra = ta.NewRow(); ra["cName"] = "a"; ta.Rows.Add(ra); DataTable tb = new DataTable("tb"); tb.Columns.Add(groupColumn("cName", "System.String")); myDs.Tables.Add(tb); DataRow rb = tb.NewRow(); rb["cName"] = "b"; tb.Rows.Add(rb); } private void button1_Click(object sender, EventArgs e) { threadOne = new Thread(new ThreadStart(Runa)); threadTwo = new Thread(new ThreadStart(Runb)); threadOne.Start(); threadTwo.Start(); } private void Runa() { while (true) { if (DateTime.Now.Second == 30) { myDs.Tables["ta"].Rows[0]["cName"] = "aa"; break; } Thread.Sleep(1000); } //Monitor.Enter(this);//锁定,保持同步 //myDs.Tables["ta"].Rows[0]["cName"] = "aa"; //Monitor.Exit(this);//取消锁定 //Thread.Sleep(5); } private void Runb() { while (true) { if (DateTime.Now.Second == 30) { myDs.Tables["tb"].Rows[0]["cName"] = "bb"; break; } Thread.Sleep(1000); } //Monitor.Enter(this);//锁定,保持同步 //myDs.Tables["tb"].Rows[0]["cName"] = "bb"; //Monitor.Exit(this);//取消锁定 //Thread.Sleep(5); } private void button2_Click(object sender, EventArgs e) { MessageBox.Show(myDs.Tables["ta"].Rows[0]["cName"].ToString() + " " + myDs.Tables["tb"].Rows[0]["cName"].ToString()); } private System.Data.DataColumn groupColumn(string ColumnName, string strType) { using (System.Data.DataColumn column = new System.Data.DataColumn()) { column.DataType = System.Type.GetType(strType); column.ColumnName = ColumnName; return column; } } } }
应该是可以的。
读的时候线程安全,写的时候,似乎DATASET也会有保护。
讀 操作是 線程安全的。如果是寫操作,就不可以了。只能new 2個了。
不可能说,你操作a表的时候也在操作b表
你是想更新a表的时候连b表也更新这样么?
从理论上讲,肯定会出现并发操作的,如果在两个线程中都使用一个变量的引用去进行操作的话,可能会出现冲突,发生异常,如果把两个DataTable分别放到两个不同的变量中去分别操作,应该就没有问题了
应该可以 期待