我需要在服务器上的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);
}
}
什么适合使用:
答案 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();
}
}
);