如何将参数传递给Thread中的ThreadStart方法?

Swa*_*pta 279 .net c# multithreading

如何将参数传递给Thread.ThreadStart()C#中的方法?

假设我有一个名为'download'的方法

public void download(string filename)
{
    // download code
}
Run Code Online (Sandbox Code Playgroud)

现在我在main方法中创建了一个线程:

Thread thread = new Thread(new ThreadStart(download(filename));
Run Code Online (Sandbox Code Playgroud)

错误方法类型预期.

如何ThreadStart使用参数将参数传递给目标方法?

Mar*_*ell 675

最简单的就是

string filename = ...
Thread thread = new Thread(() => download(filename));
thread.Start();
Run Code Online (Sandbox Code Playgroud)

这个(结束ParameterizedThreadStart)的优点是你可以传递多个参数,并且你可以获得编译时检查而无需一直进行强制转换object.

  • @ŁukaszW.pl - Noldorin所说的;在C#2.0中,一个替代构造(对于这个例子)是`new Thread(delegate(){download(filename);});` (30认同)
  • 这是一个没有参数的lambda表达式. (23认同)
  • 对于offtopic我很抱歉,'()'运算符意味着什么?我有时看到它,但我没有时间检查. (15认同)
  • @Tymek,这不是*非常准确; 捕获的任何变量都被视为完整的*词法闭包*,它(作为实现细节)被实现为编译器生成的类上的字段.另外,闭包范围被定义为声明范围.它本身并不是"作为参考"("通过引用传递"和"引用类型"都是明确定义的,并且都没有真正描述这种情况) (7认同)
  • @MarcGravell - 你是对的.我应该说的是,应该知道如果在启动线程之前'filename'发生了变化,将使用新值.我不应该对它的机制喋喋不休,我绝对不应该谈论引用. (5认同)
  • 现在我明白了..谢谢..我没有意识到lambda表达式实际上正在返回委托:) (2认同)

Łuk*_*.pl 34

看看这个例子:

public void RunWorker()
{
    Thread newThread = new Thread(WorkerMethod);
    newThread.Start(new Parameter());
}

public void WorkerMethod(object parameterObj)
{
    var parameter = (Parameter)parameterObj;
    // do your job!
}
Run Code Online (Sandbox Code Playgroud)

您首先通过将委托传递给worker方法来创建线程,然后使用Thread.Start方法启动它,该方法将您的对象作为参数.

所以在你的情况下你应该像这样使用它:

    Thread thread = new Thread(download);
    thread.Start(filename);
Run Code Online (Sandbox Code Playgroud)

但是你的'下载'方法仍然需要取对象,而不是字符串作为参数.您可以将其强制转换为方法体中的字符串.

  • 不是我的努力。 (2认同)

Nol*_*rin 24

您希望将ParameterizedThreadStart委托用于带参数的线程方法.(或者根本没有,让Thread构造函数推断.)

用法示例:

var thread = new Thread(new ParameterizedThreadStart(download));
//var thread = new Thread(download); // equivalent

thread.Start(filename)
Run Code Online (Sandbox Code Playgroud)


Mas*_*ick 5

您也可以delegate这样...

ThreadStart ts = delegate
{
      bool moreWork = DoWork("param1", "param2", "param3");
      if (moreWork) 
      {
          DoMoreWork("param1", "param2");
      }
};
new Thread(ts).Start();
Run Code Online (Sandbox Code Playgroud)


Met*_*lay 5

另外的

    Thread thread = new Thread(delegate() { download(i); });
    thread.Start();
Run Code Online (Sandbox Code Playgroud)