Tibrv конфликт с wpf? (.net 3.5)
Я пытаюсь прослушать 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 ответ
Два предложения:
1) Вместо ThreadPool.QueueUserWorkItem используйте BackgroundWorker, чтобы убедиться, что используется фоновый поток, и вы не голодаете потоком пользовательского интерфейса.
2) Если вы в конечном итоге выполняете цикл while в потоке пользовательского интерфейса, используйте цикл WPE DoEvents или просто вызовите System.Windows.Forms.Application.DoEvents(), чтобы убедиться, что цикл сообщений запущен.