-2

プロセスのキューを管理する 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);
    }

    }
4

1 に答える 1

2

必要なのは、スレッドセーフキューであるConcurrent Queueクラスを継承する新しいシングルトンクラスを実装して、マルチスレッド環境で確実に機能するようにすることです。

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; }
    }
}
于 2012-09-29T15:06:49.690 に答える