ASP NET C#:队列中有线程工作线程的单例

ASP NET C#:队列中有线程工作线程的单例,c#,asp.net,multithreading,design-patterns,c#-4.0,C#,Asp.net,Multithreading,Design Patterns,C# 4.0,我需要在web应用程序中创建一个类实例来管理进程队列。此类中有多个线程,用于查找队列并使用它。 为什么要这样做,最好的办法是什么 我已经应用了单例设计模式,但我不知道是否必须在其中创建静态队列或普通队列。有人能给我举个例子吗 解决方案 好的,谢谢!这是我的单身班: public sealed class MyWorkingSingletonClass { private static readonly ILog LOG = LogManager.GetLogger(ty

我需要在web应用程序中创建一个类实例来管理进程队列。此类中有多个线程,用于查找队列并使用它。 为什么要这样做,最好的办法是什么

我已经应用了单例设计模式,但我不知道是否必须在其中创建静态队列或普通队列。有人能给我举个例子吗

解决方案

好的,谢谢!这是我的单身班:

    public sealed class MyWorkingSingletonClass
    {

    private static readonly ILog LOG = LogManager.GetLogger(typeof(MyWorkingSingletonClass));
    private static MyWorkingSingletonClass instanza;
    private static readonly object lockObject = new object();
    private static ConcurrentQueue<Process> syncCoda = new ConcurrentQueue<Process>();

    private MyWorkingSingletonClass()
    {
    }

    public static MyWorkingSingletonClass Instanza
    {
        get
        {
            lock (lockObject)
            {
                if (instanza == null)
                    instanza = new PdfDucumentConverter();
                return instanza;
            }
        }
    }



    public void AddProcess(Process p)
    {
        syncCoda.Enqueue(p);
    }

    public void Start()
    {
        Task.Factory.StartNew(WorkerTask2);
    }

    public static void WorkerTask2()
    {

        do
        {
            try
            {
                Process p;
                if (syncCoda.TryDequeue(out p))
                {
                    p.Start();
                    p.PriorityClass = ProcessPriorityClass.High;
                    p.WaitForExit();
                }
            }
            catch (Exception ex)
            {
                LOG.Error(ex);
            }
        } while (true);
    }

    }
公共密封类MyWorkingSingleton类
{
private static readonly ILog LOG=LogManager.GetLogger(typeof(MyWorkingSingletonClass));
私有静态MyWorkingSingletonClass instanza;
私有静态只读对象lockObject=新对象();
私有静态ConcurrentQueue syncCoda=新ConcurrentQueue();
私有MyWorkingSingletonClass()
{
}
公共静态MyWorkingSingletonClass实例
{
得到
{
锁定(锁定对象)
{
如果(instanza==null)
instanza=新的PdfDucumentConverter();
返回Instantza;
}
}
}
公共流程(流程p)
{
syncCoda.Enqueue(p);
}
公开作废开始()
{
Task.Factory.StartNew(WorkerTask2);
}
公共静态无效工作区task2()
{
做
{
尝试
{
过程p;
if(syncCoda.TryDequeue(out p))
{
p、 Start();
p、 PriorityClass=ProcessPriorityClass.High;
p、 WaitForExit();
}
}
捕获(例外情况除外)
{
日志错误(ex);
}
}虽然(正确);
}
}

您需要实现新的singleton类,该类继承线程安全队列类,以确保它在多线程环境中工作:

public class SingletonConcurrentQueue<T> : ConcurrentQueue<T>
{
    private static readonly SingletonConcurrentQueue<T> 
                                   _instance = new SingletonConcurrentQueue<T>();

    static SingletonConcurrentQueue(){}
    private SingletonConcurrentQueue(){}

    public static SingletonConcurrentQueue<T> Instance
    {
        get { return _instance; }
    }
}
公共类SingletonConcurrentQueue:ConcurrentQueue
{
私有静态只读SingletonConcurrentQueue
_实例=新的SingletonConcurrentQueue();
静态SingletonConcurrentQueue(){}
私有SingletonConcurrentQueue(){}
公共静态SingletonConcurrentQueue实例
{
获取{return\u instance;}
}
}

在C#中已经有了这样做的工具。您可以使用
ThreadPool.QueueUserWorkItem
,也可以使用
Task
@Servy:ThreadPool如何管理线程推送任务和其他线程pop任务以进行处理?您应用的单例模式对于单锁来说不是线程安全的,如何调用Start或WorkerTask2,两者都是公共的?请您取消回答这个问题,这是不对的!同一类是一个队列。但如果我想管理内部的队列?是静态的吗?私有静态ConcurrentQueue _myQueque=new ConcurrentQueue()。你能给我一个例子说明类中使用队列的线程列表吗?谢谢@CuongLe,看起来很有希望。我想创建一个处理HttpWebRequests的队列,我不想让它们失去控制。