如何在C#中将参数传递给 Thread.ThreadStart()
方法?
假设我有一个名为'download'的方法
public void download(string filename)
{
// download code
}
现在我在main方法中创建了一个线程:
Thread thread = new Thread(new ThreadStart(download(filename));
期望的错误方法类型 .
如何使用带参数的目标方法将参数传递给 ThreadStart
?
9 回答
最简单的就是
这个(超过
ParameterizedThreadStart
)的优点是你可以传递多个参数,并且你可以获得编译时检查,而无需始终从object
进行强制转换 .您希望将ParameterizedThreadStart委托用于带参数的线程方法 . (或者根本没有,让
Thread
构造函数推断 . )用法示例:
你也可以
delegate
这样......看看这个例子:
您首先通过将委托传递给worker方法来创建线程,然后使用Thread.Start方法启动它,该方法将您的对象作为参数 .
所以在你的情况下你应该像这样使用它:
但是你的'download'方法仍然需要 object ,而不是 string 作为参数 . 您可以将其强制转换为方法体中的字符串 .
您可以在类中封装线程函数(下载)和所需的参数(文件名),并使用ThreadStart委托来执行线程函数 .
另外的
怎么样:(或者可以像这样使用吗?)
这是完美的方式......
根据你的问题......
...以及您遇到的错误,您必须更正您的代码
至
However, the question is more complex as it seems at first.
当前的Thread类(4.7.2)提供了多个带有重载的constructors和Start方法 .
这个问题的相关构造函数是:
和
要么是ThreadStart委托,要么是ParameterizedThreadStart委托 .
相应的代表看起来像这样:
可以看出,使用正确的构造函数似乎是采用
ParameterizedThreadStart
委托的那个,以便某些方法符合委托的指定签名,可以由线程启动 .实例化
Thread
类的一个简单例子是要不就
相应方法的签名(在此示例中称为
Work
)如下所示:剩下的就是启动线程 . 这是通过使用其中之一完成的
要么
虽然
Start()
将启动线程并将null
作为数据传递给方法,但Start(...)
可用于将任何内容传递给线程的Work
方法 .然而,这种方法存在一个大问题:传递到
Work
方法的所有内容都被转换为对象 . 这意味着在Work
方法中,它必须再次转换为原始类型,如下例所示:Casting is something you typically do not want to do.
如果有人传递了不是字符串的其他内容怎么办?因为这在一开始似乎是不可能的(因为这是我的方法,我知道我做了什么或者方法是私有的,怎么应该有人能够传递任何东西?)你可能因为各种原因而最终得到这种情况 . 由于某些情况可能不是问题,其他情况也是如此 . 在这种情况下,您可能会得到InvalidCastException,您可能不会注意到它,因为它只是终止了线程 .
作为一种解决方案,您可以获得一个通用的
ParameterizedThreadStart
委托,如ParameterizedThreadStart<T>
,其中T
将是您要传递给Work
方法的数据类型 . 不幸的是,这样的事情不存在(但是?) .然而,这个问题有一个suggested solution . 它涉及创建一个包含两者的类,要传递给线程的数据以及表示worker方法的方法,如下所示:
使用这种方法,你可以像这样启动线程:
因此,通过这种方式,您可以简单地避免转换,并提供一种向线程提供数据的类型安全方式;-)