#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. Так и должно быть — я скопировал большую часть этого из некоторого кода, который я ранее написал, в этом случае очередь должна была быть общедоступной, я просто не понял этого в данном случае