C# 使用带参数的函数在线程上创建什么?

C# 使用带参数的函数在线程上创建什么?,c#,multithreading,timer,parameter-passing,C#,Multithreading,Timer,Parameter Passing,使用带参数的函数在线程上创建什么 Thread t = new Thread(new ParameterizedThreadStart(fetchQuotes(cp))); void fetchQuotes(SomeObject obj) { [DoSomething With SomeObject] } 这里最简单的方法是在非参数化(ThreadStart)签名上使用闭包: Thread t = new Thread(() => fetchQuotes(cp)); ...

使用带参数的函数在线程上创建什么

Thread t = new Thread(new ParameterizedThreadStart(fetchQuotes(cp)));

void fetchQuotes(SomeObject obj)
{
    [DoSomething With SomeObject] 
}

这里最简单的方法是在非参数化(
ThreadStart
)签名上使用闭包:

Thread t = new Thread(() => fetchQuotes(cp));
...
t.Start();
这在编译时是静态检查正确性的,并且很方便(例如,您可以传递任意数量的参数)

另一种方法是将
对象
作为参数传递(
ParameterizedThreadStart
):


这里我们传递的是
对象
,因此在编译时不检查类型。“braindead”错误只会在运行时出现。

为了完整起见,我将在这里添加TPL语法(请参阅我之前的评论)

任务库有很多选项可以在调用线程上运行,或者在一个或多个线程上异步运行等等。

如今,大多数人都希望使用TPL(新任务库),而不是手动创建线程。所以,首先,请确保您确实想这样做,而不是使用TaskDoesTask在单独的线程上运行吗?如果是,那么我不介意使用task,否则我将不得不使用thread。Anders,为什么要用注释而不是答案?Serge:这不是原始问题的答案,如果他选择使用TPL,他将面临相同的参数问题,只是语法不同。所以我觉得这应该是一个评论。谢谢。这很有效。。现在我需要知道如何知道线程的函数何时完成工作?@Taufiq-最简单的方法是将回调传递到方法中,完成后可以调用该方法;然而,虽然我不确定它是否与每个人使用它的时间一样“遥远”,但TPL(
Task
API)有一个非常适合这种情况的完成/继续隐喻。如果您只想重新进行一些异步工作,那么
Join()
将起作用,但是启动一个线程并立即调用
Join
,是没有意义的-如果这是您的意图,您还可以在当前线程上执行该工作。
Thread t = new Thread(fetchQuotes);
...
t.Start(cp);
...
void fetchQuotes(object obj)
{
    SomeObject obj2 = (SomeObject) obj;
    [DoSomething With SomeObject] 
}
Task task = new Task(() => FetchQuotes(arg));
task.Start();