我正在尝试使用2个测试示例在c#中收听tib rv msg(使用7.5.3):一个是纯c#console app,另一个是c#WPF app。我发现控制台应用程序工作正常,但WPF一段时间后停止获取消息(它有所不同,有些时间在50 msg之后,某些时间在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);该地方不会从队列中发送任何消息。这就像队列中没有消息一样。
答案 0 :(得分:0)
两个建议:
1)使用BackgroundWorker代替ThreadPool.QueueUserWorkItem,确保使用后台线程,并且不会使UI线程挨饿。
2)如果最终在UI线程上运行while循环,请使用WPF DoEvents循环或只调用System.Windows.Forms.Application.DoEvents()以确保消息循环运行。