我想在 WPF 应用程序中使用 Lync 2013 SDK 来查询联系人可用性,尽管我看到了一些奇怪的行为。我怀疑这是因为我一次从多个线程调用它的方式,尽管不确定解决这个问题的最佳方法。
我有一个自定义用户控件,用于显示我们公司内人员的联系信息。我根据搜索查询将这些控件的集合加载到单个表单中。每个联系人控件将在创建时加载有关联系人的详细信息,使用 ThreadPool 应用一些限制。到目前为止,所有信息都来自运行良好的 AD。
现在我想显示每个联系人的联系人可用性状态。我已经整理了这段代码,该代码已从另一篇文章中修改。
private LyncClient _lyncClient;
private ContactSubscription _contactSubscription;
private void GetContactAvailability(string sip)
{
if (!String.IsNullOrEmpty(sip))
{
_lyncClient = LyncClient.GetClient();
if (_lyncClient.State == ClientState.SignedIn)
{
_lyncClient.ContactManager.BeginSearch(
sip,
SearchProviders.Default,
SearchFields.EmailAddresses,
SearchOptions.ContactsOnly,
1,
BeginSearchCallback,
new object[] {_lyncClient.ContactManager, sip});
}
}
}
private void BeginSearchCallback(IAsyncResult r)
{
var asyncState = (object[]) r.AsyncState;
var cm = (ContactManager) asyncState[0];
var results = cm.EndSearch(r);
if (results.AllResults.Count > 0)
{
Debug.WriteLine(results.Contacts.Count);
Microsoft.Lync.Model.Contact contact = results.Contacts[0];
UpdateLyncStatus(contact);
_contactSubscription = cm.CreateSubscription();
_contactSubscription.AddContact(contact);
contact.ContactInformationChanged += contact_ContactInformationChanged;
ContactInformationType[] contactInformationTypes = {ContactInformationType.Availability};
_contactSubscription.Subscribe(ContactSubscriptionRefreshRate.High, contactInformationTypes);
}
}
private void contact_ContactInformationChanged(object sender, ContactInformationChangedEventArgs e)
{
var contact = (Microsoft.Lync.Model.Contact) sender;
UpdateLyncStatus(contact);
}
private void UpdateLyncStatus(Microsoft.Lync.Model.Contact contact)
{
if ((_lyncClient != null) && (_lyncClient.State == ClientState.SignedIn))
{
UpdateLyncStatus((ContactAvailability) contact.GetContactInformation(ContactInformationType.Availability));
}
}
如果我的搜索表单只返回一个结果,那么此代码似乎每次都能成功返回单个联系人控件的可用性状态。如果我进行更通用的搜索,例如“John”(返回 50 多个结果),则只有少数(如果有)联系人显示可用性状态。该代码不会产生任何异常,它只是不起作用。
如果我再次重复搜索“John”,那么所有联系人都会显示有空状态。我怀疑这些状态是从以前的 Lync 搜索中缓存的,这很好,但是如何让它们在第一次搜索中显示?
有没有更好的方法在多线程应用程序中使用 Lync SDK?