我在带有参数的函数的线程中创建了什么?

时间:2011-08-01 10:07:46

标签: c# multithreading timer parameter-passing

我在带有参数功能的线程中创建了什么?

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

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

2 个答案:

答案 0 :(得分:1)

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

Thread t = new Thread(() => fetchQuotes(cp));
...
t.Start();

这是静态检查编译时的正确性,方便(例如,您可以传递任意数量的参数)。

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

Thread t = new Thread(fetchQuotes);
...
t.Start(cp);
...
void fetchQuotes(object obj)
{
    SomeObject obj2 = (SomeObject) obj;
    [DoSomething With SomeObject] 
}

这里我们传递object,所以不要在编译时进行类型检查。 “braindead”错误只会在运行时出现。

答案 1 :(得分:1)

我将在此处添加TPL语法以获得完整性(请参阅我之前的评论)。

Task task = new Task(() => FetchQuotes(arg));
task.Start();

任务库有很多选项可以在调用线程上运行,或者在一个或多个线程上运行async等。 http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx