WPF, вызов метода сервера в фоновом режиме - PullRequest
2 голосов
/ 10 ноября 2010

Мне нужно в wpf приложении проверять сообщения на сервере. У меня есть собственный метод, который загружает сообщения на сервер - LoadRp ().

Я хотел бы создать своего рода слушателя, который каждые 3 секунды проверял бы, нет ли на сервере новых сообщений.

Я вызываю метод для загрузки сообщений о событии таймера диспетчера, это подходит? Любое другое решение. Можно ли вызвать таймер в другом потоке в 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 Ответ

1 голос
/ 10 ноября 2010

Если вы согласны с блокировкой вашего пользовательского интерфейса на время, необходимое для проверки на сервере, то при использовании DispatcherTimer все будет работать нормально.

Если проверка новых сообщений может занять больше временичем несколько миллисекунд, и вы хотите, чтобы ваш пользовательский интерфейс реагировал во время проверки, вы должны использовать несколько потоков.В этом случае, как только новые данные поступят, вы должны использовать 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(); 
            } 
        }
 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...