将方法传递给另一个线程启动方法

时间:2014-05-30 08:00:38

标签: c# multithreading

我目前正在创建一个具有类调用专用方法的通用方法的类。其中一个通用方法需要将方法作为参数来使用它来启动新线程。

我的问题是如何完成这个参数(因此我必须替换它,或者我需要改变什么才能使其按预期工作):

Class mytest
{
   public void myPublicStarter()
   {
       Starter("Test", this.DoWork);
   }

   public void DoWork(object myIDString)
   {

   }

   private void Starter(string myIDString, <METHOD> paramethod)
   {
        Thread myThread = new Thread(paramethod);
        myThread.Start(myIDString);
   }

}

2 个答案:

答案 0 :(得分:2)

创建新的Thread对象时,必须向其传递一个委托,即引用方法的对象。如果输入方法没有参数,则该委托必须是ThreadStart,如果是,则ParameterizedThreadStart。在您的情况下,您的DoWork方法有一个参数,因此委托类型必须是后者。因为paramethod参数被声明为该类型,所以当您调用this.DoWork时,编译器知道将Starter转换为该类型。如果方法签名与委托的签名不匹配,则会发生编译错误。

public void myPublicStarter()
{
    Starter("Test", this.DoWork);
}

public void DoWork(object myIDString)
{

}

private void Starter(string myIDString, ParameterizedThreadStart paramethod)
{
     Thread myThread = new Thread(paramethod);
     myThread.Start(myIDString);
}

答案 1 :(得分:1)

嗯,在.NET中你有委托的概念,你有动作和函数,实际上只是委托。

Function表示一个带有一些输入参数并具有返回值的函数。 动作表示采用某些输入参数但不返回任何值的方法。

所以这取决于你想要达到的目标。

这是一个演示示例:

static void Main(string[] args)
{
    myPublicStarter();
}

public static void myPublicStarter()
{
    Starter("Test", () => DoWork("My Id String Passed here"));
}

public static void DoWork(object myIDString)
{
    Console.WriteLine(myIDString);
}

private static void Starter(string myIDString, Action paramethod)
{
    paramethod.Invoke();
}

}

注意:我已将这些类设为静态,因为我已将其转换为控制台应用程序。

That's the output.

现在,要使代码适应线程,您可以使用以下命令:

static void Main(string[] args)
{
    myPublicStarter();
}

public static void myPublicStarter()
{
    Starter("Test", x => DoWork("My Id String Passed here"));
}

public static void DoWork(object myIDString)
{
    Console.WriteLine(myIDString);
}

private static void Starter(string myIDString, Action<object> paramethod)
{
    Thread myThread = new Thread(x => paramethod(x));
    myThread.Start(myIDString);
}

这将生成与上面列出的完全相同的输出。