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;
        }
      });
    });
  • 相关阅读:
    sql 一对多变成一对多的最后一条记录的做法
    2.如何优化操作大数据量数据库(改善SQL语句)
    asp数据操作类DB
    4.如何优化操作大数据量数据库(几十万以上数据)(如何选择聚合索引)
    【转】asp中记录集对象的getrows和getstring用法
    用DB类写新闻系统1
    Apache+Tomcat配置负载均衡
    C# CAD 几何图形周围创建尽可能小的圆 使用 .NET 在 2D AutoCAD
    C# Cad 2007 工具栏 工具条创建
    C# Cad 拉伸 关键 GetStretchPoints MoveStretchPointsAt
  • 原文地址:https://www.cnblogs.com/summer1987/p/4624633.html
Copyright © 2011-2022 走看看