首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tibrv与wpf冲突?(.net 3.5)

Tibrv与wpf冲突?(.net 3.5)
EN

Stack Overflow用户
提问于 2011-06-29 01:14:29
回答 1查看 1.4K关注 0票数 0

我试着用两个测试示例在c#中收听tib rv msg (使用7.5.3):一个是纯c#控制台应用程序,另一个是c# WPF应用程序。我发现的是控制台应用程序工作正常,但WPF one在一段时间后停止了msg (这是变化的,有时在50 msg之后,有时在30之后等等) Any1对此有任何线索吗?

控制台应用代码:

代码语言:javascript
运行
复制
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应用程序代码:

代码语言:javascript
运行
复制
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);是不会从队列中分派任何消息的位置。好像队列中没有msg。

EN

回答 1

Stack Overflow用户

发布于 2011-06-29 01:41:08

两个建议:

1)使用BackgroundWorker而不是ThreadPool.QueueUserWorkItem,以确保使用后台线程,并且不会耗尽UI线程。

2)如果最终在UI线程上运行while循环,请使用WPF循环或仅调用System.Windows.Forms.Application.DoEvents()以确保运行DoEvents循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6510463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档