Tibrv конфликт с wpf? (.net 3.5) - PullRequest
0 голосов
/ 28 июня 2011

Я пытаюсь прослушать tib rv msg (используя 7.5.3) в c # с двумя примерами тестирования: один - чистое консольное приложение на 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);это место не будет отправлять сообщения из очереди.Как будто в очереди нет сообщений.

1 Ответ

0 голосов
/ 28 июня 2011

Два предложения:

1) Вместо ThreadPool.QueueUserWorkItem используйте BackgroundWorker, чтобы убедиться, что фоновый поток используется, а поток пользовательского интерфейса не истощается.

2) Если вы в конечном итоге запустите цикл while в потоке пользовательского интерфейса, используйте цикл WPE DoEvents или просто вызовите System.Windows.Forms.Application.DoEvents (), чтобы убедиться, что цикл сообщений запущен. *

...