我目前正在创建一个具有类调用专用方法的通用方法的类。其中一个通用方法需要将方法作为参数来使用它来启动新线程。
我的问题是如何完成这个参数(因此我必须替换它,或者我需要改变什么才能使其按预期工作):
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);
}
}
答案 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();
}
}
注意:我已将这些类设为静态,因为我已将其转换为控制台应用程序。
现在,要使代码适应线程,您可以使用以下命令:
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);
}
这将生成与上面列出的完全相同的输出。