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

Lio*_*Lou 11 c# multithreading

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

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

public void myMethod(UltraGrid myGrid)
{
}
Run Code Online (Sandbox Code Playgroud)

--------- ------------错误

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

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

Igo*_*goy 44

将参数传递给方法的更方便的方法是使用lambda表达式或匿名方法,为什么因为您可以使用所需的参数数量传递方法.ParameterizedThreadStart仅限于只有一个参数的方法.

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

public void myMethod(UltraGrid myGrid)
{
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个类似的方法

public void myMethod(UltraGrid myGrid, string s)
{
}

Thread t = new Thread(()=>myMethod(myGrid, "abc"));
t.Start();
Run Code Online (Sandbox Code Playgroud)

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

这是一本很棒的书!


gza*_*axx 12

将您的线程初始化更改为:

var t = new Thread(new ParameterizedThreadStart(myMethod));
t.Start(myGrid);
Run Code Online (Sandbox Code Playgroud)

还有以下方法:

public void myMethod(object myGrid)
{
    var grid = (UltraGrid)myGrid;
}
Run Code Online (Sandbox Code Playgroud)

匹配ParameterizedThreadStart代理签名.

  • 根本不需要使用`ParameterizedThreadStart`,因为可以推断出适当的委托类型。所以只需将参数 `myGrid` 更改为 `object` 就足够了。 (3认同)