【问题标题】:Best way to continuously monitor a MSMQ queue in WPF在 WPF 中持续监视 MSMQ 队列的最佳方法
【发布时间】:2016-06-15 14:43:57
【问题描述】:

我需要我的 WPF exe 在队列启动后立即开始监视它,然后在消息进入时对其进行响应。

我现在的方式是:

public partial class App
    {

        readonly BackgroundWorker _worker = new BackgroundWorker();
        protected override void OnStartup(StartupEventArgs e)
        {
            _worker.DoWork += worker_DoWork;
            _worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            _worker.RunWorkerAsync();

        }

        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            _worker.DoWork += worker_DoWork;
            _worker.RunWorkerAsync();
        }

        static void worker_DoWork(object sender, DoWorkEventArgs e)
        {
           //do work
        }

显然,这是非常可悲的 IMO。

另外,我不喜欢在线程内部使用while(true) 以使其无限期运行的方法..

【问题讨论】:

    标签: wpf multithreading msmq


    【解决方案1】:

    不是永久地而是定期地从队列中读取消息就足够了。
    常见的方法是使用计时器。例如,System.Threading.Timer。

    public partial class App : Application
    {
        private System.Threading.Timer _msmqReadTimer;
    
        public App()
        {
            _msmqReadTimer = new System.Threading.Timer(MsmqReadTimerTick);
            _msmqReadTimer.Change(0, 1000); // call MsmqReadTimerTick immediatelly and each 1000 ms
        }
    
        private void MsmqReadTimerTick(object state)
        {
            // do work
    
            // if you want to update some UI components after work, you should post this to UI thread dispatcher:
            this.Dispatcher.Invoke(()=> 
            {
                // logic for updating UI should be here
            }, 
            System.Windows.Threading.DispatcherPriority.Background);
        }
    }
    

    【讨论】:

    • 谢谢,但计时器比我已经拥有的更糟糕,mq.Receive() 方法在每次循环迭代中等待消息
    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多