ThreadPool.QueueUserWorkItem在c#2.0中的单独线程中运行方法时出错

时间:2011-04-05 13:52:01

标签: c#

我得到了一个通过线程调用任何方法的代码。

System.Threading.ThreadPool.QueueUserWorkItem(Export());

这里我尝试通过线程运行Export()方法并得到编译错误。代码有什么问题。我正在使用c#2.0版本。请帮忙。

4 个答案:

答案 0 :(得分:2)

QueueUserWorkItem需要代理,但您正在调用Export方法,然后尝试将Export结果传递给QueueUserWorkItem } 方法。换句话说,就好像你正在运行:

var result = Export();
ThreadPool.QueueUserWorkItem(result);

显然将在另一个帖子中运行Export ...

假设Export方法的签名是正确的,您只需将其从方法调用更改为方法组转换:

ThreadPool.QueueUserWorkItem(Export);

编辑:如果需要为Export方法提供参数,最简单的方法是使用lambda表达式(假设您使用的是C#3)。例如:

ThreadPool.QueueUserWorkItem(state => Export(filename));

答案 1 :(得分:2)

方法Export是否返回WaitCallback类型的委托?如果没有,那么您将向QueueUserWorkItem提供错误的参数。需要说明的是,您需要提供符合以下签名的委托:

public delegate void WaitCallback(
    Object state
)

因此,方法Export应具有以下签名:

public void Export(object state)

并按如下方式提供给QueueUserWorkItem

ThreadPool.QueueUserWorkItem(Export)

或者,如果Export具有不同的签名,那么您可以使用中间委托来调用它:

ThreadPool.QueueUserWorkItem(state=>Export())

或如果Export需要参数,您可以:

ThreadPool.QueueUserWorkItem(state=>Export(some,parameters))

答案 2 :(得分:2)

您可能必须编写ThreadPool.QueueUserWorkItem(new WaitCallback(Export))并修改export以具有object类型的单个参数,即:

Export(object state)
{
......

}

当您调用QueueUserWorkItem()

时,状态是您可以传递给回调函数的参数

答案 3 :(得分:1)

提供Export匹配要提供给QueueUserWorkItem的代理人:

ThreadPool.QueueUserWorkItem(Export);

通过使用括号编写Export(),您调用方法而不是传递给QueueUserWorkItem以在单独的线程上调用。