Как создать синглтон с помощью асинхронного метода?

#c#

#c#

Вопрос:

Я хочу иметь синглтон, скажем Printer , с одним методом, скажем bool addToPrintQueue(Document document) . addToPrintQueue должен быть асинхронным (должен возвращаться немедленно), возвращать, true если добавлен в очередь и false если документ уже в queue . Как написать такой метод и что я должен использовать для queue обработки? (должен ли это быть отдельный поток?)

Ответ №1:

Рассматривали ли вы возможность создания шаблона асинхронности на основе событий. Поскольку каждому асинхронному событию соответствует завершенное событие, которое возникает при завершении метода. Это покажет, добавлен ли документ в очередь или произошел сбой.

Я бы создал Printer.addToPrintQueue событие и позволил подписчикам подписаться на него.

 printer.addToPrintQueueCompleted  = _addToPrinterQueueCompleted;
printer.addToPrintQueueAsync();


private void _addToPrinterQueueCompleted(object sender, addToPrintQueueCompletedEventArgs e)
{ /* ... */ }
  

Ответ №2:

Не совсем уверен, зачем вам здесь нужен синглтон, асинхронный поток с блокировкой должен здесь отлично подойти

  // create a document queue
    private static Queue<string> docQueue = new Queue<string>();

    // create async caller and result handler
    IAsyncResult docAdded = null;
    public delegate bool AsyncMethodCaller(string doc);

    // 
    public void Start()
    {
        // create a dummy doc
        string doc = "test";

        // start the async method
        AsyncMethodCaller runfirstCaller = new AsyncMethodCaller(DoWork);
        docAdded = runfirstCaller.BeginInvoke(doc,null,null);
        docAdded.AsyncWaitHandle.WaitOne();

        // get the result
        bool b = runfirstCaller.EndInvoke(docAdded);
    }


    // add the document to the queue
    bool DoWork(string doc)
    {

        lock (docQueue)
        {
            if (docQueue.Contains(doc))
            {
                return false;
            }
            else
            {
                docQueue.Enqueue(doc);
                return true;
            }
        }
    }
}
  

Комментарии:

1. Не должно docQueue быть закрытым?

2. Так и должно быть — я скопировал большую часть этого из некоторого кода, который я ранее написал, в этом случае очередь должна была быть общедоступной, я просто не понял этого в данном случае