1

我想在 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?

4

0 回答 0