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;
        }
      });
    });
  • 相关阅读:
    Git本地操作2
    Blast在windows下的使用过程
    和为T
    出现次数最多的整数
    蓝桥杯 未名湖边的烦恼 java
    蓝桥杯数字三角形 java
    ①①将线性拉伸
    ⑩把线型对象转平面对象
    ⑨矩形
    ⑧建立样条:(样条也能够被拉伸)
  • 原文地址:https://www.cnblogs.com/summer1987/p/4624633.html
Copyright © 2011-2022 走看看