如果我有一个C#线程方法
public void Method(int m)
{
...
}
我怎么能创建一个线程来这种方法吗?
Thread t = new Thread((Method));
t.Start(m);
不工作。
如果我有一个C#线程方法
public void Method(int m)
{
...
}
我怎么能创建一个线程来这种方法吗?
Thread t = new Thread((Method));
t.Start(m);
不工作。
你调用的方法需要一个参数。因为它有一个参数和返回类型void你可以使用下面的
ThreadPool.QueueUserWorkItem(o => Method(m));
你不需要使用此方法的int更改为对象的方法签名。
使用ThreadPool比手动启动自己的Thread更有优势。 Thread vs ThreadPool
ThreadStart tsd = new ThreadStart(ThreadMethod);
Thread t = new Thread(tsd);
t.Start();
Thread方法需要与返回类型空隙,不接受参数的方法。
public void ThreadMethod() {.....}
还有另一种变体,其是ParameterizedThreadStart
ParameterizedThreadStart ptsd = new ParameterizedThreadStart(ThreadParamMethod);
Thread t = new Thread(ptsd);
t.Start(yourIntegerValue);
ThreadParamMethod是返回类型是void和接受型对象的一个参数的方法。但是,你可以将任何事物作为对象传递给对象。
public void ThreadParamMethod(object arg) {.....}
难道你不能通过摆脱'ptsd'来缩短'ParameterizedThreadStart'的例子,只是做'Thread t = new Thread(ThreadParamMethod);'?编译器是否会自动构造'ParameterizedThreadStart'委托? (我真的没有尝试过) – Justin 2011-03-02 19:27:20
方法需要采取的对象不是一个int,以便能够使用ParameterizedThreadStart委托。
因此,将m改为一个对象并首先将其转换为int。
您可以使用lambda表达式来执行此操作。 C#编译器会在幕后自动创建ThreadStart
委托。
Thread t = new Thread(() => Method(m));
t.Start();
请注意,如果你改变m
在后面的代码,更改将传播到线程,如果它没有进入Method
呢。如果这是一个问题,你应该复制m
。
究竟发生了什么?什么不起作用?您是否收到错误消息或方法不起作用?你可以发布一些额外的代码? – 2011-03-01 14:44:46
是的我有一个错误:无法从方法组转换为System.Threading.ParameterizedThreadStart – elisa 2011-03-01 14:46:31