我想实现的是: 在线程一中: 
  不断的从数据库中读取数据信息匹配
  当匹配出 达到我们监控的要求后  我会把这条信息  存储在 全局的 datatable中 在线程二中:
  我会对datatable中的数据一条条的删除  数据匹配存储这个过程是一直进行的 不能受打扰,即使在datatable被线程二使用着,也要马上让给
线程一去操作。不知道能否实现这样的效果不??想过用lock,lock(datatable),这样实现我的功能,不知这样是否正确??

解决方案 »

  1.   

    用信号量的话  当我对datatable操作的时候, 不是就不能让线程一去添加数据了吗?
      

  2.   


    用锁也是一样的,无论是用信号量还是锁都只要在操作datatable的时候用,换句话说就是尽量减少信号量或锁的控制范围。
      

  3.   

    用事件    public class Insert
        {
           
            public void SpinUp()
            {
                ThreadStart start = new ThreadStart(this.Start);
                Thread _thread = new Thread(start);
               
                _thread.Start();
            }
            private void Start()
            {
                
                for (int i = 1; i <= 5; i++)
                {
                    Thread.Sleep(1000);//实现延迟启动 
                  
                    Delete.sem.Reset();//强行暂停Delete把控制句柄交给Insert
                   
                    Console.WriteLine("新增第 " + i.ToString() + " 行");
                    Manage.d.Rows.Add(new object[] { i, i.ToString() });
               
                    Delete.sem.Set();// 释放Delete
                }
                Delete.fi = 1;
            }
        }
        public class Delete
        {
          
            public static ManualResetEvent sem = new ManualResetEvent(false);
            public static int fi = 0;
            public void SpinUp()
            {
                ThreadStart start = new ThreadStart(this.Start);
                Thread _thread = new Thread(start);
                _thread.Name = "Delete";
                _thread.Start();
            }
            private void Start()
            {
                do
                {
                    sem.WaitOne();                for (int i = Manage.d.Rows.Count-1; i >= 0; i--)
                    {
                        Console.WriteLine("删除第 " + Manage.d.Rows[i][0] + " 行");
                        Manage.d.Rows[i].Delete();
                    }
                    
                } while (fi == 0);
                Console.WriteLine("所剩行数: " + Manage.d.Rows.Count.ToString());
                Console.ReadLine();
            }
        }
    class Manage
        {
            public static DataTable d = new DataTable();
            public Manage()
            {
                DataColumn dc1 = new DataColumn("ID");
                DataColumn dc2 = new DataColumn("value");
                d.Columns.AddRange(new DataColumn[] { dc1, dc2 });
            }
            public void start()
            {
                Insert i = new Insert();
                i.SpinUp();
                Delete de = new Delete();
                de.SpinUp();
            }
        }
      

  4.   


    你好,我想问   lock 可以替换你写的那段代码吗?? 替换了,能达到你那效果不??