- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
MessengerClient 类中有一个登录 函数。 MessengerClient 类有一个 LoggedIn 事件和一个 IsLoggedIn 属性。
当在 MessengerClient 类上调用 Login 时,通过套接字从远程服务器获取联系人列表/花名册并进行处理,然后客户端被视为已登录IsLoggedIn 将返回 true。 LoggedIn 事件在登录函数内部引发(因此,在同一线程内请求登录——我认为这不是坏事)。
登录后,客户端会在更新发生时从远程服务器接收实时更新。
在登录期间处理联系人列表/花名册时,我认为最终用户的理想设计是在客户端被视为已登录之前处理所有联系人列表/花名册数据。这样,当用户收到 LoggedIn 事件,他们能够立即访问联系人数据。
例如-
这里我们有 LoggedIn 事件的最终用户处理程序。
void MsgrLoggedIn(object sender, EventArgs a)
{
_msgr.Contacts.Contains("billy@bob.com"); //returns true
}
因为在客户端被标记为已登录之前所有联系人列表都已处理,并且在引发 LoggedIn 事件之前,上述语句返回 true。从逻辑上讲,我相信这是最终用户所期望的,因为下载和处理联系人列表是登录操作的一部分。
现在,我还喜欢在联系人已添加到联系人列表或添加到群组时引发事件。按照我到目前为止提到的逻辑,在处理数据时引发 ContactAdded、ContactAddedToGroup 等事件显然没有意义,因为这会导致最终用户在 MessengerClient 类甚至被标记为已登录之前收到这些事件之一。
void MsgrContactAdded(object sender, ContactEventArgs e)
{
_msgr.SendMessage(e.Contact, "hello there"); // throws NotLoggedInException
}
如上所示,会导致不好的事情发生。
所以我真正需要做的是处理联系人列表数据,引发登录事件,然后引发所有其他联系人事件。
为此,我可以遍历所有联系人对象、组对象等,并引发适当的事件。
到目前为止还好吧?
但问题是,除了在第一次登录时下载联系人列表数据外,我还必须准备在客户端注销然后重新登录时同步联系人数据。
这将涉及诸如 ContactRemoved、ContactNameChanged、ContactRemovedFromGroup 等事件。
因此它不再像遍历联系人、组等那样简单,因为现在我必须考虑已删除或属性已更改的联系人。
所以我需要一种替代方法来“排队”这些事件,以便在登录后引发这些事件。
我考虑过用类来表示每个同步事件——例如 SyncContactRemoved、SyncContactNameChanged、SyncContactAddedToGroup。有了这个,我可以处理数据,并为每个事件创建一个 Sync*XXX* 类,并将它们添加到一个列表中,然后我可以在登录后迭代该列表。
我还考虑过对对象本身使用方法。即 Group.SyncContactsAdded、Contact.SyncNameChanged、MessengerClient.SyncContactsAdded。然后我可以在登录后遍历联系人/组等,检查这些属性,在必要时引发事件,然后清除它们。
最后,我考虑了一个包含 EventHandler 和 EventArgs 的事件类。事件可以以这种方式排队,然后在登录后一个一个地调用。
如果有的话,哪些模式会被认为是更常见的做法。或者是否有其他方法可以实现这一目标?
很抱歉问了这么长的问题,但这不是一个简单的问题。
谢谢
最佳答案
每个联系人都有自己的联系人列表。
public class Contact
{
List<Contact> Contacts;
}
每个联系人都有自己的事件(PropertyChanged、LoggedIn 等)
public class Contact
{
List<Contact> Contacts;
public event OnPropertyChanged;
}
如果联系人登录,此联系人将注册到其联系人列表中每个联系人的所有事件。
public void LogIn
{
//Load Contact List for User - Do other stuff
foreach(Contact c in Contacts)
c.PropertyChanged += new PropertyChangedEventHandler(ContactPropertyChanged);
}
现在,如果联系人列表中发生了某些事情,那些已登录并在列表中有此联系人的人将获得事件。
public void ChangeProperty
{
//Change Property and raise event!
}
关于c# - Messenger 库中联系人列表/花名册下载/同步的理想设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10086617/
从许多帖子中我可以读到有关最大池大小的公式,它取决于 CPU 的数量 + 1。这是一个明确的解释。 但是如果应用程序定义了许多执行器或线程池执行器怎么办。然后我们还必须考虑应用程序共享相同的硬件。这对
我一直在寻找垂直 Accordion 内容 slider 。我找到了一个:http://www.marghoobsuleman.com/jQuery-common-accordion ,而且还不错。我
在 not having a whole bunch of luck 之后找到任何可充当 SNMP 代理的 .NET SNMP 库(可在 OSS 项目中使用 - 这意味着专有库已经过时),我现在正在考
目前我正在考虑: VMWare 管理程序 ESXi 中央操作系统 5.5 内存缓存 1.4.5和依赖 这就是全部。我还需要什么/任何替代品吗? 最佳答案 Memcached在linux上运行的很好,所
我是一名优秀的程序员,十分优秀!