2011-06-28 9 views
0

私はtib rv msg(7.5.3を使用)をC#で2つのテスト例で聴いています:1つは純粋なC#コンソールアプリ、もう1つはC#WPFアプリです。私が見つけたのは、コンソールアプリケーションはうまく動作しますが、WPFは1つ後にmsgを取得するのをやめます(それは、時々、50のメッセージの後に、いつかは30などの後に変わります)。Tibrvとwpfの競合? (.net 3.5)

コンソールアプリケーションコード:

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アプリコード:WPFコード、Queue.Default.TimedDispatch(0)で

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

。その場所はキューからmsgをディスパッチしません。キューにmsgがないようです。

答えて

0

つの提案:

1)の代わりにThreadPool.QueueUserWorkItemのは、バックグラウンドスレッドを使用すると、あなたはUIスレッドを飢えていないことを保証するためにBackgroundWorkerのを使用しています。

2)UIスレッドでwhileループを実行すると、WPF DoEventsループを使用するか、System.Windows.Forms.Application.DoEvents()を呼び出してメッセージループが実行されるようにします。

+0

ありがとうございますが、whileループでQueue.Default.TimedDispatch(0)がすべて呼び出されることを示すデバッグコードがあるので、WPFスレッドに関連しているとは思われません。問題はそれがメッセージをディスパッチしないということです(待ち行列からメッセージを受け取ることができないか、ディスパッチできないためです)wierdのことは、この同じコードがコンソールC#アプリでうまく動作します... –

+0

あなたがメッセージディスパッチを開始していることを確認し、メッセージが通過していない場合、スレッディングの問題である可能性が非常に高いですが、スレッディングの問題を正しく認識していない可能性があります。 –