WPF,在后台工作者中调用服务器方法

时间:2010-11-10 20:23:55

标签: wpf multithreading timer

我需要在服务器上的wpf app检查消息。我有自己的方法在服务器上加载消息 - LoadRp()。

我想创建一种侦听器,每3秒检查服务器上是否有新消息。

我调用方法在调度程序计时器tick事件上加载消息,它是否合适?任何其他解决方案可以在wpf中的另一个线程中调用计时器吗?

代码在这里:

    public MessangerWindow(PokecCommands pokecCmd)
    {
        InitializeComponent();

        PokecCmd = pokecCmd;

        _friendsData = PokecCmd.LoadFriends();
        friendsListBox.DataContext = _friendsData;

        _dispatcherTimer = new DispatcherTimer();
        _dispatcherTimer.Tick+=new EventHandler(DispatcherTimer_Tick);
        _dispatcherTimer.Interval = new TimeSpan(0,0,3);
        _dispatcherTimer.Start();
    }

    private void DispatcherTimer_Tick(object sender, EventArgs eventArgs)
    {
        try
        {

            //try load new message from sever
            RP message = PokecCmd.LoadRp();

            //arived message
            if (message != null)
            {
                //exist window
                if (_chatWindows.ContainsKey(message.Nick))
                {
                    _chatWindows[message.Nick].Show();
                }
                {
                    //create new Window
                    var chatWindow = new ChatWindow(PokecCmd, message);
                    _chatWindows.Add(message.Nick, chatWindow);
                    chatWindow.Show();
                }
            }
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
        }  
    }

什么适合使用:

  • 没有后台线程的调度程序
  • 带有后台主题的调度程序
  • 多线程

1 个答案:

答案 0 :(得分:1)

如果您可以将UI锁定在检查服务器上的时间,那么使用DispatcherTimer就可以正常工作了。

如果检查新邮件的时间可能超过几毫秒,并且您希望UI在检查时具有响应性,则应使用多个线程。在这种情况下,一旦新数据到达,您将使用Dispatcher.Invoke来显示它。

检查邮件的线程中的代码可能如下所示:

//try load new message from sever 
RP message = PokecCmd.LoadRp(); 

//arived message 
if( message != null )
    Dispatcher.Invoke(DispatcherPriority.Send, new Action(() =>
        { 
            //exist window 
            if (_chatWindows.ContainsKey(message.Nick)) 
            { 
                _chatWindows[message.Nick].Show(); 
            } 
            { 
                //create new Window 
                var chatWindow = new ChatWindow(PokecCmd, message); 
                _chatWindows.Add(message.Nick, chatWindow); 
                chatWindow.Show(); 
            } 
        }
 );