gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:10:40 24 4
gpt4 key购买 nike

假设我有一个方法,例如 ThreadPool.QueueTask(Delegate d)。

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

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

最好的方法是什么?我应该只执行 Threadpool.QueueTask(Delegate d, EventWaitHandle e),还是有更优雅的方式让不熟悉此类事情的人显而易见?

亲切的问候,河豚

最佳答案

您可以使用 ManualResetEvent :

public void TaskStartMethod()
{
ManualResetEvent waitHandle = new ManualResetEvent(false);

ThreadPool.QueueUserWorkItem(o=>
{
// Perform the task here

// Signal when done
waitHandle.Signal();
});

// Wait until the task is complete
waitHandle.WaitOne();
}

Essentially, the method passing the task to the threadpool should be waiting until it has completed.

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

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

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 日):您甚至可能不需要回调委托(delegate),您可以直接调用 OnTaskComplete,这也应该可以完成工作:

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

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

关于c# - 我已经编写了一个线程池,如何通知使用它的方法任务已经完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4760755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com