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;
        }
      });
    });
  • 相关阅读:
    python爬取斗图网中的 “最新套图”和“最新表情”
    SpringBoot (1) idea下的环境搭建及demo
    python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频
    微信小程序—day05
    从零起步做到Linux运维经理, 你必须管好的23个细节
    前后端分离原理
    图文并茂|为你揭开微服务架构的“神秘面纱”!
    swarm集群日常部分操作
    OpenStack 部署运维实战
    京东618:Docker扛大旗,弹性伸缩成重点 (2015-06-23)
  • 原文地址:https://www.cnblogs.com/summer1987/p/4624633.html
Copyright © 2011-2022 走看看