我目前正致力于基于wcf服务的聊天客户端 - 服务器应用程序,该服务以双工模式运行。我有两个WPF应用程序:服务器本身托管的服务器和客户端。
这是服务合同:
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ISendToClient))]
interface IChatService
{
[OperationContract]
ChatUser ClientConnect(ChatUser userName);
[OperationContract]
void RemoveUser(ChatUser user);
[OperationContract(IsOneWay = true)]
void sendNewMessage(ChatMessage message);
}
interface ISendToClient
{
[OperationContract]
void newUserConnected(ChatUser user);
[OperationContract(IsOneWay = true)]
void deliverNewMessage(ChatMessage message);
}
及其实施:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class ChatService : IChatService, INotifyPropertyChanged
{
public ChatService()
{
conectedUsers = new ObservableCollection<ChatUser>();
}
ISendToClient callback;
private ObservableCollection<ChatUser> _conectedUsers;
public ObservableCollection<ChatUser> conectedUsers
{
get { return _conectedUsers; }
set
{
if (_conectedUsers == value) return;
_conectedUsers = value;
OnPropertyChanged();
}
}
public ChatUser ClientConnect(ChatUser user)
{
//do smth
}
public List<ChatMessage> GetNewMessages(ChatUser user)
{
//do smth
}
public void sendNewMessage(ChatMessage newMessage)
{
callback = OperationContext.Current.GetCallbackChannel<ISendToClient>();
callback.deliverNewMessage(newMessage);
}
#region PropertyChangedMembers
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName]String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
在clinet方面查看模型包括另外两种方法
public void newUserConnected(ChatUser user)
{
Users.Add(user);
}
public void deliverNewMessage(ChatMessage message)
{
messHistory.Add(message);//adding message to ObservaleCollection
//this Collection is binded to listbox, but not displays
}
服务器使用此方法通知客户端有关新消息或登录的新用户的信息。
服务配置正确,客户端可以连接到服务器并发送消息,服务器通过在客户端调用deliverNewMessage()方法将它们发送给所有用户,此消息成功添加到ObservaleCollection,绑定到listBox:
<ListBox Grid.Row="0" Margin="3" Name="lst"
ItemsSource="{Binding messHistory}" />
BUT! listBox中不显示任何消息。我试着这样做:
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messHistory.Add(message);
}));
没有效果。 我想,错过了一个小细节,但没有任何线索。
我很感激如何解决这个问题。