C# - ThreadPool QueueUserWorkItem使用?

Bit*_*lue 25 c# multithreading delegates threadpool

就在我现在使用以下代码添加排队的线程.我不喜欢它.而且我的同事也不会因为他们不太了解C#.我想要的只是将一个方法排队在一个新线程中执行.

private static void doStuff(string parameter)
{
    // does stuff
}

// call (a)
ThreadPool.QueueUserWorkItem(a => doStuff("hello world"));
// call (b)
ThreadPool.QueueUserWorkItem(delegate { doStuff("hello world"); });
Run Code Online (Sandbox Code Playgroud)

那么还有其他用途ThreadPool.QueueUserWorkItem吗?

最好的是另一个1-Line-Call.如果可能,使用Func<>Action<>.


编辑:得到(b)答案和评论,我已经更喜欢它了.

ila*_*sch 17

您的问题的答案取决于您如何设计应用程序.你把它放在一个共同的项目中吗?你不想开销简单的操作.

但是,你可以为ThreadPool QueueUserItem创建一个接收params,1 param,2 param等的泛型调用.这很好,而不是发送一个简单的字符串并受到限制.

这是如何使用WaitCallback来创建参数QueueUserItem:

ThreadPool.QueueUserWorkItem(
  new WaitCallback(delegate(object state)
  { YourMethod(Param1, Param2, Param3); }), null);
Run Code Online (Sandbox Code Playgroud)

使用ThreadPoolC#Execute方法(带参数)中获取

一些想法的链接:
http://msdn.microsoft.com/en-us/library/4yd16hza.aspx
.NET中的通用ThreadPool
委托.BeginInvoke与C#中的ThreadPool线程之间的区别


Mat*_*son 16

我不完全确定你正在寻找什么样的语法,但如果你不喜欢a你的例子中未使用的语法,为什么不使用Task呢?

Task.Run(() => doStuff("hello world"));
Run Code Online (Sandbox Code Playgroud)

它看起来并没有好多少,但至少它没有未使用的标识符.

注意:Task.Run()是.Net 4.5或更高版本.如果你正在使用.Net 4,你必须这样做:

Task.Factory.StartNew(() => doStuff("hello world"));
Run Code Online (Sandbox Code Playgroud)

这并不短.

以上两者都使用线程池.

如果你真的必须避免使用lambda,你可以使用匿名委托(@nowhewhomustnotbenamed已经提到过):

Task.Run(delegate { doStuff("Hello, World!"); });
Run Code Online (Sandbox Code Playgroud)

但那有什么意义呢?它的可读性低得多!

  • 不久之前,@ mini-me Lambda表达式几乎取代了匿名代表.因此,你应该尽快适应它们,而不是迟早. (11认同)