ASP NET C#:队列中有线程工作线程的单例
我需要在web应用程序中创建一个类实例来管理进程队列。此类中有多个线程,用于查找队列并使用它。 为什么要这样做,最好的办法是什么 我已经应用了单例设计模式,但我不知道是否必须在其中创建静态队列或普通队列。有人能给我举个例子吗 解决方案 好的,谢谢!这是我的单身班: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
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的队列,我不想让它们失去控制。