如何在c#中传递参数给Thread.ThreadStart()方法?

假设我有一个叫做download的方法

public void download(string filename)
{
    // download code
}

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

Thread thread = new Thread(new ThreadStart(download(filename));

预期的方法类型错误。

我如何通过参数ThreadStart与目标方法参数?


当前回答

您可以将线程函数(下载)和所需的参数(文件名)封装在一个类中,并使用ThreadStart委托来执行线程函数。

public class Download
{
    string _filename;

    Download(string filename)
    {
       _filename = filename;
    }

    public void download(string filename)
    {
       //download code
    }
}

Download = new Download(filename);
Thread thread = new Thread(new ThreadStart(Download.download);

其他回答

在额外的

    Thread thread = new Thread(delegate() { download(i); });
    thread.Start();

看看这个例子:

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

public void WorkerMethod(object parameterObj)
{
    var parameter = (Parameter)parameterObj;
    // do your job!
}

你首先通过将delegate传递给worker方法来创建一个线程,然后用thread启动它。Start方法,该方法将对象作为参数。

所以在你的例子中,你应该这样使用它:

    Thread thread = new Thread(download);
    thread.Start(filename);

但是你的“download”方法仍然需要以object而不是string作为参数。你可以在方法体中将其转换为字符串。

最简单的就是

string filename = ...
Thread thread = new Thread(() => download(filename));
thread.Start();

这样做(相对于ParameterizedThreadStart)的优点是可以传递多个参数,并且可以进行编译时检查,而不需要一直从object进行强制转换。

您可以将线程函数(下载)和所需的参数(文件名)封装在一个类中,并使用ThreadStart委托来执行线程函数。

public class Download
{
    string _filename;

    Download(string filename)
    {
       _filename = filename;
    }

    public void download(string filename)
    {
       //download code
    }
}

Download = new Download(filename);
Thread thread = new Thread(new ThreadStart(Download.download);

这里有一个完美的方法……

private void func_trd(String sender)
{

    try
    {
        imgh.LoadImages_R_Randomiz(this, "01", groupBox, randomizerB.Value); // normal code

        ThreadStart ts = delegate
        {
            ExecuteInForeground(sender);
        };

        Thread nt = new Thread(ts);
        nt.IsBackground = true;

        nt.Start();

    }
    catch (Exception)
    {

    }
}

private void ExecuteInForeground(string name)
{
     //whatever ur function
    MessageBox.Show(name);
}