怎样给C# 中的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; } }); });
关于怎样给C# 中的QueueUserWorkItem传参问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。