我最近要做一个短信群发的程序,有一个页面sendsmsPage是把群发短信内容(接受人,姓名等)存入队列然后再将它放到另外一个页面smsListPage的待发列表里面,由于可能要用线程完成待发列表中每一个item的操作(取消发送啊优先发送等),所以要用线程和互斥锁来对列表里面的资源进行访问.我在smsListPage的类里面创建了一个Mutex mtx,把它设定为静态变量,然后用一个静态方法public static void addtolist(Queue que),这个函数是用来将sendsmsPage中传过来的属性添加到待发列表sendingList(是listview控件),那由于要对临界资源进行插入操作所以用mtx来加一个临界区。问题就来了:
在同一个类里面我有取消发送sendcancel 优先发送sendfirst这两个按钮,分别也要对列表进行临界资源的访问,我也加了临界区,这两个运行的很正常。由于我是在sendsmsPage里面调用了smsListPage里面的静态方法addtolist,但是当临界区上锁的时候短信内容还是成功添加到了待发列表,没有锁住。各位大虾,这是肿么回事啊??

解决方案 »

  1.   

    这完全是你的代码混乱造成,你都知道了是因为调用了addtolist,所以你就想办法不要在所内部调用它,自己把逻辑捋顺
      

  2.   

    我把这两个代码贴一下,其中mtx也声明成为静态的      
      public static void AddToSendingList()
            {
                mtx.WaitOne();
                Thread.Sleep(5000);
                while (SendSmsPage.SendingSmsQue.Count != 0)
                {
                    smsInfo smsinfo = (smsInfo)SendSmsPage.SendingSmsQue.Dequeue();
                    SendingSmsListDataTable.Rows.Add("状态", smsinfo.getTelNum()+num.ToString(), " ", smsinfo.getSmsContent());
                }
                mtx.ReleaseMutex();
            }以下是调用它的页面SendSmsPage中的一段代码        private void sendBtn_Click(object sender, RoutedEventArgs e)
            {
                //////////1.进入待发列表
                smsInfo smsinfo=new smsInfo(telTxtBx.Text,contentTxtBx.Text);
                SendingSmsQue.Enqueue(smsinfo);            SendingListPage.AddToSendingList();
    以下省略
            }