我一直在编写一个基于CodeProject的套接字服务器,它本身来自原始的Microsoft示例.
在这两种情况下,使用相同的SocketAsyncEventArgs立即将入站消息返回给发件人.就我而言,我需要关闭入站消息,以便在回复客户端之前进行进一步的异步处理.
问题是返回的响应可能会尝试同时使用相同的SocketAsyncEventArgs作为来自客户端的进一步消息.发生这种情况时,我得到以下异常:
"An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance"
所以,(我相信)我需要一个单独的SocketAsyncEventArgs池来传回消息.到目前为止都可以理解.
我的问题是,我不确定如何创建出站SocketAsyncEventArgs,因为它与入站密切相关.
我可以重复使用多少入站数据?例如,如果我只指向同一个AcceptSocket,那么当消息同时向两个方向传播时会有麻烦吗?
有没有人有一些示例代码如何从入站的SocketAsyncEventArgs派生出来?或者我错过了这一点?
我感到困惑; 我以为我理解了INotifyPropertyChanged.
我有一个小的WPF应用程序,前端是MainWindow类,中间有一个视图模型,后面有一个模型.
我的模型是模拟器类.
SimulatorViewModel几乎是透明的,只是MainWindow和Simulator之间的接口属性.
Simulator实现了INotifyPropertyChanged,Simulator中的每个属性setter都调用了RaisePropertyChanged方法:
private string serialNumber;
public string SerialNumber
{
get { return serialNumber; }
set
{
serialNumber = value;
RaisePropertyChanged("SerialNumber");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
Run Code Online (Sandbox Code Playgroud)
在xaml中,我有一个带有这样绑定的TextBox:
Text="{Binding Path=SerialNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Run Code Online (Sandbox Code Playgroud)
并且DataContext是SimulatorViewModel(但是请参阅我关于将DataContext更改为模型的注释)
ViewModel只传递属性:
public string SerialNumber
{
get { return Simulator.SerialNumber; }
set { Simulator.SerialNumber = value; }
}
Run Code Online (Sandbox Code Playgroud)
Simulator中属性SerialNumber的编程更新不会传播到UI,但奇怪的是,在Simulator构造函数中设置的初始值正在到达那里.
如果我在模拟器中断开SerialNumber setter并进入RaisePropertyChanged,我发现PropertyChanged为null,因此事件不会向上传播到GUI.
这引出了几个问题:
究竟应该挂进PropertyChanged事件?我希望比"WPF"更具体.该事件与xaml中的Binding语句之间的联系是什么?
为什么初始属性值在启动时会到达UI,但后来却没有?
我是否有权使用模拟器(模型)实现INotifyPropertyChanged,或者它应该是ViewModel吗?如果ViewModel这样做,那么模型中的程序化更改不会触发PropertyChanged,所以我不清楚正确的模式.我意识到我的ViewModel实际上是多余的,但这是由于项目的简单性; 更复杂的一个会使ViewModel概念更加努力.我的理解是ViewModel是我的单元测试接口的地方.