我想在线程池中运行一个方法。构建以下代码时会出现错误
'method'没有重载匹配委托'System.Threading.WaitCallback'。
我知道错误发生在哪里,但我不知道原因:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Thread_Pool
{
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(PrintNumbers));
// PrintNumbers();
}
static void PrintNumbers()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(3000);
}
}
}
}
当上面的代码被重写为以下代码时,它可以正常工作。
static void PrintNumbers(object Stateinfo)
为什么会这样?我可以使用其他类型(例如int
,float
)?
答案 0 :(得分:1)
我知道错误发生在哪里,但我不知道为什么?什么时候上面 代码被重写如下,它工作正常
您必须遵循WaitCallback
所要求的单一性,因为您可以看到WaitCallback的委托定义。这就是PrintNumbers
需要具有object
类型参数的原因。
public delegate void WaitCallback(
Object state
)
为什么会这样?而不是使用对象我可以使用另一种类型 (比如int,float)?有可能吗?
是的,您可以使用Convert.ToDouble(obj);
答案 1 :(得分:1)
根据MSDN
WaitCallback
委托想要 Object
参数:
[ComVisibleAttribute(true)]
public delegate void WaitCallback(Object state)
即使你不打算使用它,你也应该提供:
static void Main(string[] args) {
ThreadPool.QueueUserWorkItem(new WaitCallback(PrintNumbers));
}
static void PrintNumbers(Object state) { // <- "Object state" is required here
...
}
如果您想完整保留 PrintNumbers ,可以使用 lambda :
static void Main(string[] args) {
ThreadPool.QueueUserWorkItem(
(Object state) => { // <- You have to use "Object state"
PrintNumbers();
}
);
}
static void PrintNumbers() {
...
}
答案 2 :(得分:0)
创建委托时,参数的数量和类型必须匹配。
在当前版本的C#中,使用lambda表达式比显式键入的委托更容易。它使转换类型更容易,并允许传递强类型参数
ThreadPool.QueueUserWorkItem( unused => PrintNumbers()));
int intBalue = 1;
double doubleValue = 2;
ThreadPool.QueueUserWorkItem( unused => Method(intValue, doubleValue) );
或者您仍然可以像往常一样传递价值:
ThreadPool.QueueUserWorkItem( state => MethodTakinObject(state));
答案 3 :(得分:0)
WaitCallback是一个接受参数对象的委托。为了使用委托,您的方法必须匹配委托签名,如下所示:
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem( new WaitCallback( PrintNumbers ) );
}
static void PrintNumbers(object a)
{
for ( int i = 0; i < 10; i++ )
{
Console.WriteLine( i );
Thread.Sleep( 3000 );
}
}
或者你可以简单地使用lambda表达式
ThreadPool.QueueUserWorkItem( a => { PrintNumbers(); } );
功能方面两种方法都是相同的。 &#34;州&#34;只有在打算将值传入方法时才需要参数。