繁体   English   中英

使用线程池中的方法

[英]Using methods in thread pool

我想在线程池中运行一个方法。 构建以下代码时会出错

'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)

为什么会这样? 我可以使用另一种类型(如intfloat )而不是使用对象?

我知道错误发生在哪里,但我不知道为什么? 当上面的代码被重写为如下,它工作正常

你必须遵循WaitCallback所需的WaitCallback ,因为你可以看到WaitCallback的委托定义。 这就是PrintNumbers需要具有object类型的参数的原因。

public delegate void WaitCallback(
    Object state
)

为什么会这样? 而不是使用对象我可以使用另一种类型(如int,float)? 可能吗?

是的,你可以使用Convert.ToDouble(obj);

根据MSDN

http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(System.Threading.WaitCallback);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang -csharp)RD =真

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() { 
    ...
  }

创建委托时,参数的数量和类型必须匹配。

在当前版本的C#中,使用lambda表达式比显式类型的委托更容易。 它使转换类型更容易,并允许传递强类型参数

ThreadPool.QueueUserWorkItem( unused => PrintNumbers()));

int intBalue = 1;
double doubleValue = 2;
ThreadPool.QueueUserWorkItem( unused => Method(intValue, doubleValue) );

或者你仍然可以照常传递价值:

ThreadPool.QueueUserWorkItem( state => MethodTakinObject(state));

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(); } );

功能方面两种方法都是相同的。 仅当您打算将值传入方法时,才需要“state”参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM