zoukankan      html  css  js  c++  java
  • 总结QueueUserWorkItem传参的几种方式

    最近在学习citrix的xenserver6.2的源代码,发现多处用到System.Threading命名空间下的ThreadPool.QueueUserWorkItem方法:

    public static bool QueueUserWorkItem(WaitCallback callBack, object state);
    publicstaticbool QueueUserWorkItem(WaitCallback callBack);

    参数WaitCallback 本身是一个delegate,它在System.Threading命名空间中的定义如下:

    [ComVisible(true)]
    public delegate void WaitCallback(object state);

     于是问题来了,该如何给QueueUserWorkItem传参呢?以下是我遇到的一些方式:

    1,直接传delegate。(不明白object o去了哪里?

    ThreadPool.QueueUserWorkItem(delegate
    {
      for (int i = 0; i < 20 && TargetNode.Nodes.Count == 0; i++)
      {
        Thread.Sleep(100);
      }
    
      MainWindowCommandInterface.Invoke(delegate { TargetNode.Expand(); });
    });

    2,直接传方法名。

    ThreadPool.QueueUserWorkItem(WaitForReboot, connection);
    private void WaitForReboot(object o)
    {
    }

    3,用delegate构造一个WaitCallback。

    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(Object o)
    {
      ClientFillRectangle(0, 0, DesktopSize.Width, DesktopSize.Height, Color.Black);
    }), null);

    4,用含一个object类型的方法Connect构造一个WaitCallback。

    ThreadPool.QueueUserWorkItem(new WaitCallback(Connect), new KeyValuePair<VNCGraphicsClient, Exception>(vncClient, null));
    private void Connect(object o)
    {
    }

    5,WaitCallback类型的delegate。

    ThreadPool.QueueUserWorkItem((WaitCallback)delegate(object o)
    {
      // Sleep a short time before closing the splash
      Thread.Sleep(500);
      Program.Invoke(Program.MainWindow, Program.CloseSplash);
    });

    6,直接传Lambda表达式。

    ThreadPool.QueueUserWorkItem(o =>
    {
      Program.Invoke(Program.MainWindow, () =>
      {
        PerformStorageSystemScan();
    
        if (systemsAfter.Count > systemsBefore.Count)
        {
          // the new item should be selected.
          comboBoxStorageSystem.SelectedItem = systemsAfter.Find(ss => !systemsBefore.Contains(ss));
          comboBoxStorageSystem.DroppedDown = true;
        }
      });
    });
  • 相关阅读:
    SP3946 MKTHNUM
    P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)
    CF375D Tree and Queries(dsu on tree)
    P2051 [AHOI2009]中国象棋(动态规划)
    P3810 【模板】三维偏序(陌上花开)(cdq分治)
    P4390 [BOI2007]Mokia 摩基亚(cdq分治)
    P2163 [SHOI2007]园丁的烦恼(cdq分治)
    UVA11270 Tiling Dominoes(轮廓线动态规划)
    P2475 [SCOI2008]斜堆(递归模拟)
    P2617 Dynamic Rankings(带修主席树)
  • 原文地址:https://www.cnblogs.com/summer1987/p/4624633.html
Copyright © 2011-2022 走看看