0

我正在制作“我自己的 lync 客户端”。我在网上关注了几个关于如何使用 Ui Suppression 模式签署 lync 客户端的示例。我可以让客户登录,但随后它会立即循环退出和登录。

这是什么原因造成的?

2014-11-12 08:18:30.4381|DEBUG|LyncWpf.MainWindow|InitClient
2014-11-12 08:18:31.2021|DEBUG|LyncWpf.MainWindow|InitializeCallback
2014-11-12 08:18:31.2131|DEBUG|LyncWpf.MainWindow|StateChanged Uninitialized to Initializing
2014-11-12 08:18:31.2131|DEBUG|LyncWpf.MainWindow|StateChanged Initializing to SignedOut
2014-11-12 08:18:31.4221|DEBUG|LyncWpf.MainWindow|StateChanged SignedOut to SigningIn
2014-11-12 08:18:51.8631|DEBUG|LyncWpf.MainWindow|SigninCallback
2014-11-12 08:18:52.0151|DEBUG|LyncWpf.MainWindow|StateChanged SigningIn to SignedIn
2014-11-12 08:18:52.0211|INFO|LyncWpf.MainWindow|signed in!
2014-11-12 08:18:52.5451|DEBUG|LyncWpf.MainWindow|StateChanged SignedIn to SigningOut
2014-11-12 08:18:52.5591|DEBUG|LyncWpf.MainWindow|StateChanged SigningOut to SigningIn
2014-11-12 08:18:53.6051|DEBUG|LyncWpf.MainWindow|StateChanged SigningIn to SignedIn
2014-11-12 08:18:53.6071|INFO|LyncWpf.MainWindow|signed in!
...repeated forever

代码示例。请注意,我不再调用 BeginSignIn。

    private void _client_StateChanged(object sender, ClientStateChangedEventArgs e)
    {
        this.Log().Debug("StateChanged {0} to {1}", e.OldState.ToString(), e.NewState.ToString());
        switch (e.NewState)
        {
            case ClientState.SignedIn:
                this.Log().Info("signed in!");
                break;
            case ClientState.SignedOut:
                if (e.OldState == ClientState.Initializing)
                    ((LyncClient) sender).BeginSignIn(null, null, null, SigninCallback, sender);
                break;
        }
    }
    private void InitClient()
    {
        this.Log().Debug("InitClient");
        _client = LyncClient.GetClient(true);
        if (_client.InSuppressedMode)
        {
            _client.StateChanged += _client_StateChanged;
            if (_client.State == ClientState.Uninitialized)
            {
                Object[] asyncState = { _client };
                _client.BeginInitialize(InitializeCallback, asyncState);
            }
        }
    }
    private void InitializeCallback(IAsyncResult ar)
    {
        this.Log().Debug("InitializeCallback");
        if (ar.IsCompleted)
        {
            object[] asyncState = (object[])ar.AsyncState;
            ((LyncClient)asyncState[0]).EndInitialize(ar);
        }
    }
    private void SigninCallback(IAsyncResult ar)
    {
        this.Log().Debug("SigninCallback");
        if (ar.IsCompleted)
        {
            try
            {
                ((LyncClient)ar.AsyncState).EndSignIn(ar);
            }
            catch (RequestCanceledException re)
            {
                this.Log().Warn("SignIn Request Cancelled {0}", re.Message);
                throw; 
            }
        }

    }
4

1 回答 1

1

我在应用程序的第二次运行时遇到了同样的问题。就我而言,这是因为 Lync 2013 关闭 api 无法正常工作,并在内存中留下了 lync 的副本。当您第二次运行您的应用程序时,它会创建一个新的 ui 抑制模式 lync 实例,并且这两个实例似乎相互争斗以登录。

我发现解决此问题的唯一方法是终止所有后台 lync 进程(即没有主窗口句柄)。

于 2014-11-21T18:50:52.973 回答