开发者

Tibrv conflict with wpf? (.net 3.5)

I'm trying to listen to tib rv msg (using 7.5.3) in c# with 2 test examples: one is pure c# console app, the other is c# WPF app. What I found is the console app works fine but the WPF one stop getting msg after a while(it varies, sometime after 50 msg, sometime after 30 etc) Any1 has any clue on this?

console app code:

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 app code:

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 
}
}

In WPF code, Queue.Default.TimedDispatch(0); is the place won't dispatch any msg from the queue. It's like there's no msg in the queue.


Two suggestions:

1) Instead of ThreadPool.QueueUserWorkItem, use BackgroundWorker to ensure a background thread is used and you're not starving the UI thread.

2) If you do end up running your while loop on the UI thread, use a WPF DoEvents loop or just call System.Windows.Forms.Application.DoEvents() to make sure that the message loop gets run.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜