Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中的通用线程池_C#_.net_Multithreading_Generics_Threadpool - Fatal编程技术网

C# NET中的通用线程池

C# NET中的通用线程池,c#,.net,multithreading,generics,threadpool,C#,.net,Multithreading,Generics,Threadpool,对于我来说,以及对于许多.NET程序员来说,这里有一个相对常见的任务: 我想使用.NET线程池来调度需要处理给定类型任务的工作线程 作为刷新程序,ThreadPool及其关联委托的排队方法的签名为: public static bool QueueUserWorkItem ( WaitCallback callBack, Object state ) public delegate void WaitCallback (Object state) 因此,一个典型的通用工作线程类

对于我来说,以及对于许多.NET程序员来说,这里有一个相对常见的任务:
我想使用.NET线程池来调度需要处理给定类型任务的工作线程

作为刷新程序,ThreadPool及其关联委托的排队方法的签名为:

public static bool QueueUserWorkItem (
    WaitCallback callBack,
    Object state
)
public delegate void WaitCallback (Object state)
因此,一个典型的通用工作线程类类似于:

public class Worker<T> {
    public void schedule(T i_task) {
        ThreadPool.QueueUserWorkItem(execute, i_task)
    }
    private void execute(Object o){
        T task = (T)o;  //What happened to the type safety?  
        executeTask(task);
    }
    private void executeTask(T i_task){
        //process i_task
    }
}
这将使工人类类型安全(而且更清楚,IMHO):

公共类工作者{
公共作废时间表(TIU任务){
ThreadPool.QueueUserWorkItem(执行,i_任务)
}
私有void执行(ti_任务){
//进程i_任务
}
}

我一定是遗漏了什么。

因为通过向线程池传递匿名委托或lambda(通过变量捕获)来打包您喜欢的任何状态都很简单,所以不需要通用版本

例如,您可以编写一个实用程序函数:

static void QueueItem<T>(Action<T> action, T state)
{
    ThreadPool.QueueUserWorkItem(delegate { action(state); });
}
静态无效队列项(操作,T状态)
{
QueueUserWorkItem(委托{action(state);});
}

但这并不是非常有用,因为您可以在池任务中需要状态的任何时候自己使用委托。

听起来您在谈论工作队列?(我听起来像克利皮…)

作为记录,线程池线程通常应用于较短的工作。理想情况下,您应该为长期队列创建自己的线程。请注意.NET4.0可能会采用CCR/TPL库,因此我们将免费获得一些内置工作队列,但编写线程化工作队列并不困难。你也可以让它变得通用-p

问题是-我更喜欢捕获变量的方法来将状态传递到线程中(无论是
线程
线程池
、还是
控件。调用
):


这使您可以更精确地控制线程,而不会使
线程池饱和

线程池自.NET 1.1没有泛型以来就存在


我喜欢他们选择不破坏向后兼容性的方式:-)

我不理解你不使用线程池作为工作队列的底层“执行”层的论点。使用.NET ThreadPool类时,由于线程数量有限,这是一个问题吗?在我看来,假设工作队列中的任务很短是很自然的。你能详细解释一下吗?我认为这不是一个有效的论点。只要看看1.1中的所有容器类,它们在2.0中“升级”为使用泛型。另外,我不是建议更换队列。。。方法,但要在其旁边添加通用版本。
public class Worker<T> {
    public void schedule(T i_task) {
        ThreadPool.QueueUserWorkItem<T>(execute, i_task)
    }
    private void execute(T i_task){
        //process i_task
    }
}
static void QueueItem<T>(Action<T> action, T state)
{
    ThreadPool.QueueUserWorkItem(delegate { action(state); });
}
    Thread t = new Thread(() => SomeMethod(arg));
    t.IsBackground = true;
    t.Name = "Worker n";
    t.Start();