首页 新闻 会员 周边 捐助

一个DataSet两个Table,可否同时操作

0
悬赏园豆:50 [已解决问题] 解决于 2012-04-26 16:55

如题,列如:

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;
            }
        }
    }
}
项工的主页 项工 | 初学一级 | 园豆:71
提问于:2012-04-26 10:39
< >
分享
最佳答案
0

应该是可以的。

读的时候线程安全,写的时候,似乎DATASET也会有保护。

收获园豆:10
无之无 | 大侠五级 |园豆:5095 | 2012-04-26 10:47
其他回答(4)
0

讀 操作是 線程安全的。如果是寫操作,就不可以了。只能new 2個了。

收获园豆:10
無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-26 10:44
0

不可能说,你操作a表的时候也在操作b表

 

你是想更新a表的时候连b表也更新这样么?

收获园豆:10
┢┦偉 | 园豆:1240 (小虾三级) | 2012-04-26 10:44
0

从理论上讲,肯定会出现并发操作的,如果在两个线程中都使用一个变量的引用去进行操作的话,可能会出现冲突,发生异常,如果把两个DataTable分别放到两个不同的变量中去分别操作,应该就没有问题了

收获园豆:10
sinhbv | 园豆:2579 (老鸟四级) | 2012-04-26 10:47
0

应该可以   期待

收获园豆:10
KivenRo | 园豆:1734 (小虾三级) | 2012-04-26 11:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册