none
这样使用Monitor能达到预期效果吗? RRS feed

  • 问题

  • private static object lockobj = new object();
     private static List<MyPack> list = new List<MyPack>();
     static System.Timers.Timer timer = null;
     public static void Run()
        {
          timer = new System.Timers.Timer();
          timer.Interval = 60000;
          timer.Elapsed += new ElapsedEventHandler(
            (o, e) =>
            {
              BeginSend(ref list);
            });
          timer.Enabled = true;
          timer.Start();
        }
    public static void AppendItemToPipe(MyPack item)
        {
          while (!Monitor.TryEnter(lockobj))
          {
            Thread.Sleep(2);
          }
          if (item != null)
          {
            maillist.Add(item);
          }
          Monitor.Exit(lockobj);
        }
        private static void BeginSend(ref List<MyPack> list)
        {
          while (!Monitor.TryEnter(lockobj))
          {
            Thread.Sleep(2);
          }
          foreach (var single in list)
          {
            System.Threading.ThreadPool.QueueUserWorkItem(
              o =>
              {
                send(single);
              }
            );
          }
          list = new List<MyPack>();
          Monitor.Exit(lockobj);
        }
    

     

    程序启动时会运行Run()方法。
    外部通过AppendItemToPipe方法添加一个对象到list<MyPack>中。
    每隔1分钟执行一次BeginSend,在执行BeginSend时不允许外部通过AppendItemToPipe方法向List中添加对象。当BeginSend方法foreach执行完成后再次允许外部通过AppendItemToPipe方法向List中添加对象。

    上面这段代码能达到这样的预期目的吗?


    郭鹏
    2010年6月22日 17:37

答案

  • 你好,

    你的代码中有错误。

    1.你是加入到list<MyPack> list,但是你的代码中是加入到maillist。

    你把上面明显的错误改过后试试。


    Microsoft Online Community Support
    2010年6月24日 3:02