C# I';如果我编写了一个线程池,我如何通知使用它的方法任务已经完成?

C# I';如果我编写了一个线程池,我如何通知使用它的方法任务已经完成?,c#,multithreading,delegates,threadpool,C#,Multithreading,Delegates,Threadpool,假设我有一个方法,比如ThreadPool.QueueTask(委托d) 其中一些委托需要返回值,但由于它们不能返回值(作为委托传递),因此需要通过引用将值作为参数。任务完成后,此值将被更改,因此调用方法需要知道这一点 本质上,将任务传递给线程池的方法应该等待任务完成 最好的方法是什么?我应该只做Threadpool.QueueTask(委托d、EventWaitHandle e),还是有一种更优雅的方式,对于不熟悉这类事情的人来说更为明显 亲切问候,, 河豚您可以使用: 本质上,通过 线程池的

假设我有一个方法,比如ThreadPool.QueueTask(委托d)

其中一些委托需要返回值,但由于它们不能返回值(作为委托传递),因此需要通过引用将值作为参数。任务完成后,此值将被更改,因此调用方法需要知道这一点

本质上,将任务传递给线程池的方法应该等待任务完成

最好的方法是什么?我应该只做Threadpool.QueueTask(委托d、EventWaitHandle e),还是有一种更优雅的方式,对于不熟悉这类事情的人来说更为明显

亲切问候,, 河豚

您可以使用:

本质上,通过 线程池的任务应该是 等待它完成

上面的代码就是这样做的,但是现在我有一个问题:如果您的方法正在等待任务完成,那么为什么还要在单独的线程上执行任务呢?换句话说,您描述的是代码的顺序执行,而不是并行执行,因此使用
ThradPool
是毫无意义的

或者,您可能希望使用单独的委托作为回调:

public delegate void OnTaskCompleteDelegate(Result someResult);

public void TaskStartMethod()
{
    OnTaskCompleteDelegate callback = new OnTaskCompleteDelegate(OnTaskComplete);
    ThradPool.QueueUserWorkItem(o=>
    {
        // Perform the task

        // Use the callback to notify that the
        // task is complete. You can send a result
        // or whatever you find necessary.
        callback(new Result(...));
    });

}

public void OnTaskComplete(Result someResult)
{
    // Process the result
}
更新(2011年1月24日): 您甚至可能不需要回调委托,您可以直接调用
OnTaskComplete
,这也可以完成此工作:

public void TaskStartMethod()
{
    ThradPool.QueueUserWorkItem(o=>
    {
        // Perform the task

        // Call the method when the task is complete
        OnTaskComplete(new Result(...));
    });
}

这取决于你是怎么做的。对我来说,这听起来有点像是一个线程在线程池中放置一个任务,然后等待它完成。这听起来没什么帮助。如果您将一个任务放在线程池中等待,只需在您自己的线程中执行即可

但这可能不是你要做的

我可以看到使用线程池的两种可能的好方法。线程A有多件事情要并行启动,然后等待它们全部完成。在这种情况下,您需要存储所有任务(或结果类)的句柄,以便等待它们全部完成。您可以使用半量或各种同步工具(我不专门使用c#)来避免繁忙的轮询


另一种方法是在任务结束时使用回调。线程A启动线程池上的任务,然后存在。该任务有一个返回到启动它的类的句柄,并在完成时调用回调类型函数来执行最终确定类型的操作。

有什么原因不能使用TPL来执行此操作吗?如果您可以使用,我可以提出一个很好的解决方案。任务并行库。应该在.NET 4.0中对您可用-是的,很遗憾.NET 4.0目前对我不可用。在我能够使用它之前,我必须编写一个自定义线程池,这比它需要等待的时间要少。生活就是这样,我听说4.0可以解决我的问题:)@Fugu奇怪的是,在任务完成之前,你的方法被阻止了。如果调用方被阻止,使用线程池有什么好处?非常感谢所有的回复。现在的情况是,在顶部有一个WCF服务,请求使用这些方法进入,这些方法都使用threadpool。threadpool通过确保堆栈中没有太多的进程排队(它在高层使用),从而节省内存,当然还可以同时运行它们。我在这里做什么有问题吗?我知道我没有给出太多的信息,但我希望前提是合理的?我成功地使用回调来实现这一点。您还可以使用回调来报告进度,主线程通过回调的return参数返回go/no-go信号。这是ManualResetEvent(false)还是true?
public void TaskStartMethod()
{
    ThradPool.QueueUserWorkItem(o=>
    {
        // Perform the task

        // Call the method when the task is complete
        OnTaskComplete(new Result(...));
    });
}