嗨,我有一个生产者 - 消费者模式。WPF UI 是一个长期运行的工作线程的辅助工具,它正在侦听数据包和排队任务。在实践中,所有消息都出队,然后是 UI 消费者进程。
我遇到的问题是我有一个负责所有 WPF GUI 组件的 UIcontroller 类。它会打开一个新窗口,显示每个出队的任务,并保存一个线程安全的引用窗口集合。
我通过 Despatcher.BeginInvoke 发出信号。那里没有惊喜。
我遇到的问题是,如果 UIController 类成功打开 cconfigured 数量的窗口,我想暂停/从字面上停止我的工作线程。打开的窗口数量有限制。一旦打开的窗口数量减少到界限内,我就会恢复队列的处理。我尝试在此类中保存我的窗口集合,并通过调用将其传递给 UI,在该调用中它通过引用进行更新,但 Begin Invoke 是异步的,并且计数不会在工作线程的循环中及时更新。
我可以测试在 UIcontroller 类中打开的窗口的数量,忽略甚至从那里重新排队任务 - 基本上不采取任何行动。但我想要一个更清洁的解决方案。
我可以做一些干净的回调吗?
public void Work()
{
while (true)
{
Log.Instance.Info("****In worker THREAD " + _worker.Name);
while (_controller.IncomingMessages.Count > 0 && [--test for no of windows open on GU thread somehow - I did try holding a reference to the collection in this class--])
{
try
{
Log.Instance.Info("****In Notification worker THREAD and messages to process " + _worker.Name);
Messages.AlertMessage task = null;
lock (_locker)
{
if (_controller.IncomingMessages.Count > 0 && ToasterPopUps.Count < 5)
{
task = _controller.IncomingMessages.Dequeue();
if (task == null)
{
return;
}
}
if (task != null)
{
Log.Instance.Info("Dequeing: " + task + " " + task.ID + " from Notification thread");
_UIthread.BeginInvoke(DispatcherPriority.Background, new JoinUIThread(DespatchUIThread), task, _UIthread);
}
}
}
catch (Exception err)
{
Log.Instance.Critical(string.Format("Unexpected Error in PollPopUp Thread Queue {0} ", err));
}
}
Log.Instance.Info("No more Notification tasks - wait for a signal");
_wh.WaitOne();
}
}
public void DespatchUIThread(Messages.AlertMessage task, System.Windows.Threading.Dispatcher dispatcherThread)
{
try
{
_controller.CreateWindow(task, dispatcherThread);
}
catch (Exception err)
{
Log.Instance.Critical("Critical error " + err);
}
}