0

我正在尝试用 2 个测试示例在 c# 中收听 tib rv msg(使用 7.5.3):一个是纯 c# 控制台应用程序,另一个是 c# WPF 应用程序。我发现控制台应用程序工作正常,但 WPF 会在一段时间后停止接收消息(它会有所不同,有时在 50 条消息之后,有时在 30 条之后等)Any1 对此有任何线索吗?

控制台应用程序代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TIBCO.Rendezvous;

using System.Threading;

namespace testTibcoListener
{
class Program
{
    static int count = 0;
    static void Main(string[] args)
    {

        TIBCO.Rendezvous.Environment.Open();
        TIBCO.Rendezvous.Transport aa = new NetTransport(service, network, daemon);
        Connection cn = new Connection("TEST.>", aa);
        cn.MessageReceived += OnDeleteOrderMessageReceived;
        WaitCallback wc = (o) =>
        {
            while (true)
            {
                Queue.Default.TimedDispatch(0);  
            }
        };

        ThreadPool.QueueUserWorkItem(wc);

        while (true)
        {
            Thread.Sleep(200);
        }
    }

    static private void OnDeleteOrderMessageReceived(object listener, MessageReceivedEventArgs args)
    {
        TIBCO.Rendezvous.Message msg = args.Message;
        Console.WriteLine(count);
        count++;
    }
}

public class Connection : IDisposable
{
    private string sendSubject;
    private string inbox;
    private TIBCO.Rendezvous.Transport transport;
    private TIBCO.Rendezvous.Listener listener;

    public Connection(string sendSubject,
                      Transport transport)
    {
        this.sendSubject = sendSubject;
        this.transport = transport;
        this.inbox = this.transport.CreateInbox();
        this.listener = new TIBCO.Rendezvous.Listener(
          TIBCO.Rendezvous.Queue.Default, this.transport, this.sendSubject, null);
    }
    public event TIBCO.Rendezvous.MessageReceivedEventHandler MessageReceived
    {
        add { this.listener.MessageReceived += value; }
        remove { this.listener.MessageReceived -= value; }
    }


    public void Send(TIBCO.Rendezvous.Message msg)
    {
        try
        {
            this.transport.Send(msg);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }
    }

    #region IDisposable Members
    public void Dispose()
    {
        this.listener.Destroy();
    }
    #endregion
}
}

WPF 应用程序代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using TIBCO.Rendezvous;
using System.ComponentModel;
using System.Threading;
using System.Windows.Threading;

namespace WpfApplication2
{
public partial class Window1 : Window
{
    public int count_;
    public Window1()
    {
        InitializeComponent();
        count_ = 0;

        TIBCO.Rendezvous.Environment.Open();
        TIBCO.Rendezvous.NetTransport aa = new NetTransport(service, network, daemon);
        Connection cn = new Connection("TEST.>", aa, this);
        cn.MessageReceived += OnDeleteOrderMessageReceived;
        WaitCallback wc = (o) =>
        {          
            while (true)
            {   
                    Queue.Default.TimedDispatch(0);       //          
            }
        };

        ThreadPool.QueueUserWorkItem(wc);
    }

    private void OnDeleteOrderMessageReceived(object listener, MessageReceivedEventArgs args)
    {
        TIBCO.Rendezvous.Message msg = args.Message;
        int aaa = 1111;

        aaa = msg.FieldCountAsInt;

        this.textBox1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
             new DispatcherOperationCallback(delegate
             {

                 int a = 1;// rd.Next(2);             
                 this.count_++;
                 if (a == 1)
                 {
                     this.textBox1.Text = "total count: " + System.Convert.ToString(this.count_) + ",queue: " + System.Convert.ToString(Queue.Default.Count);
                 }
                 else
                 {
                     this.textBox1.Text = "11111";
                     a = 1;
                 }
                 return null;
             }), null);


    }

}
public class Connection : IDisposable
{
    private string sendSubject;
    private string inbox;
    private TIBCO.Rendezvous.Transport transport;
    private TIBCO.Rendezvous.Listener listener;
    private WpfApplication2.Window1 myWindow;
    public Connection(string sendSubject,
                      Transport transport,WpfApplication2.Window1 window)
    {
        this.sendSubject = sendSubject;
        this.transport = transport;
        this.inbox = this.transport.CreateInbox();
        this.listener = new TIBCO.Rendezvous.Listener(
          TIBCO.Rendezvous.Queue.Default, this.transport, this.sendSubject, null);
        this.myWindow = window;           
    }
    public event TIBCO.Rendezvous.MessageReceivedEventHandler MessageReceived
    {
        add { this.listener.MessageReceived += value; }
        remove { this.listener.MessageReceived -= value; }
    }


    public void Send(TIBCO.Rendezvous.Message msg)
    {
        try
        {
            this.transport.Send(msg);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }
    }

    #region IDisposable Members
    public void Dispose()
    {
        this.listener.Destroy();
    }
    #endregion 
}
}

在 WPF 代码中,Queue.Default.TimedDispatch(0); 是这个地方不会从队列中分派任何味精。就像队列中没有消息一样。

4

1 回答 1

0

两个建议:

1) 使用 BackgroundWorker 代替 ThreadPool.QueueUserWorkItem,以确保使用后台线程并且您不会饿死 UI 线程。

2) 如果您最终在 UI 线程上运行 while 循环,请使用 WPF DoEvents 循环或调用 System.Windows.Forms.Application.DoEvents() 以确保消息循环运行。

于 2011-06-28T17:41:08.137 回答