使用带参数的方法创建新线程

23

我正在尝试创建新的线程并传递带参数的方法,但出现了错误。

Thread t = new Thread(myMethod);
t.Start(myGrid);

public void myMethod(UltraGrid myGrid)
{
}

---------错误信息------------

错误: CS1502 - 行 92 (164) - 'System.Threading.Thread.Thread(System.Threading.ThreadStart)' 的最佳重载方法匹配存在一些无效参数

错误: CS1503 - 行 92 (164) - 参数 '1':无法从 '方法组' 转换为 'System.Threading.ThreadStart'


5
我猜我们需要猜测你遇到了哪个错误?请在您的问题中提供您遇到的错误! - ThiefMaster
你的类中有多个名为 myMethod 的方法吗? - Damien_The_Unbeliever
3个回答

78
lambda表达式或匿名方法是传递参数给方法的更便捷方式,因为您可以使用所需数量的参数传递该方法。ParameterizedThreadStart仅限于具有一个参数的方法。
Thread t = new Thread(()=>myMethod(myGrid));
t.Start();

public void myMethod(UltraGrid myGrid)
{
}

如果你有一个像这样的方法:
public void myMethod(UltraGrid myGrid, string s)
{
}

Thread t = new Thread(()=>myMethod(myGrid, "abc"));
t.Start();

这是一本很好的书,可以阅读! 以下是需要翻译的内容:

http://www.albahari.com/threading/#_Passing_Data_to_a_Thread


谢谢,帮了我很大的忙。 - Akshay

15
把你的线程初始化改为以下内容:
var t = new Thread(new ParameterizedThreadStart(myMethod));
t.Start(myGrid);

同时也需要方法:

public void myMethod(object myGrid)
{
    var grid = (UltraGrid)myGrid;
}

为了匹配ParameterizedThreadStart委托的签名。


4
完全不需要使用ParameterizedThreadStart,因为适当的委托类型可以被推断出来。所以只需将参数myGrid更改为object即可。 - sloth

0
    public void myMethod(object myGrid)
    {
        var typedParam = (UltraGrid)myGrid;
        //...
    }


    Thread t = new Thread(new ParameterizedThreadStart(myMethod));
    t.Start(myGrid);

这很不错,但如果myMethod返回了一些东西怎么办?我应该对代码做哪些更改? - PewK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接