Код ниже представляет собой веб-API, который печатается от имени SPA.Для краткости я опустил операторы using
и реальную логику печати.Это все работает отлично.Интерес представляет рефакторинг логики печати в фоновом потоке с методом веб-API, ставящим задачу в очередь.Я сделал это, потому что задания на печать, отправленные в быстрой последовательности, мешали друг другу только с последней печатью задания.
Это решает проблему сериализации заданий на печать, но поднимает вопрос о том, как обнаружить отключение и подать сигнал петле.terminate.
namespace WebPrint.Controllers
{
public class LabelController : ApiController
{
static readonly ConcurrentQueue<PrintJob> queue = new ConcurrentQueue<PrintJob>();
static bool running = true;
static LabelController()
{
ThreadPool.QueueUserWorkItem((state) => {
while (running)
{
Thread.Sleep(30);
if (queue.TryDequeue(out PrintJob job))
{
this.Print(job);
}
}
});
}
public void Post([FromBody]PrintJob job)
{
queue.Enqueue(job);
}
}
public class PrintJob
{
public string url { get; set; }
public string html { get; set; }
public string printer { get; set; }
}
}
Учитывая способ, которым я получаю поток для обслуживания очереди печати, он почти наверняка помечен как фоновый поток и должен завершиться, когда пул приложений пытается выйти, но я не уверен вэто, и поэтому я прошу вас, дорогие читатели, о вашем коллективном представлении о наилучшей практике в таком сценарии.
Тем не менее, у меня нет длительных фоновых задач, у меня есть краткосрочные задачи.Они поступают асинхронно в разные потоки, , но должны выполняться последовательно и в одном потоке , потому что методы печати WinForms предназначены для потоков STA.
Мэтт Летаргик о возможной потере работы, безусловно, является соображением, но для этого случая это не имеет значения.Задания никогда не ставятся в очередь дольше, чем на несколько секунд, и потеря просто повлечет за собой попытку оператора.
В этом отношении использование очереди сообщений не решает проблему «что если кто-то отключит ее во время ее использования», а просто перемещает ее в другое программное обеспечение.Многие очереди сообщений не являются постоянными, и вы не поверите, сколько раз я видел, как кто-то использовал MSMQ для решения этой проблемы, а затем не смог настроить ее на постоянство.
Это было оченьинтересно.
http://thecodelesscode.com/case/156