1

WPF アプリケーションで Lync 2013 SDK を使用して連絡先の空き状況を問い合わせたいのですが、奇妙な動作が見られます。これは、一度に多くのスレッドから呼び出す方法が原因であると思われますが、これを解決するための最良の方法はわかりません。

社内の人々の連絡先情報を表示するためのカスタム UserControl があります。検索クエリに基づいて、これらのコントロールのコレクションを 1 つのフォームに読み込みます。各連絡先コントロールは、作成時に連絡先に関する詳細情報を読み込み、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));
        }
    }

私の検索フォームが 1 つの結果のみを返す場合、このコードは毎回動作して、1 つの連絡先コントロールの可用性ステータスを正常に返すように見えます。「John」(50 件以上の結果が返される) など、より一般的な検索を行うと、空き状況が表示される連絡先は (あるとしても) ごくわずかです。コードは例外を生成しません。単に機能しません。

「ジョン」の検索をもう一度繰り返すと、すべての連絡先に空き状況が表示されます。これらのステータスは以前の Lync 検索からキャッシュされているのではないかと思いますが、最初の検索でそれらを表示するにはどうすればよいですか?

マルチスレッド アプリケーションで Lync SDK を使用するためのより良い方法はありますか?

4

0 に答える 0