You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Lync Client的BeginSignIn时触发InvalidOperationException异常求助

解决Lync Client BeginSignIn时的InvalidOperationException异常

这个异常的核心原因很明确:你在调用BeginSignOut后,没有等待异步登出操作完全完成,就直接发起了BeginSignIn请求。Lync Client的状态是严格流转的,当客户端处于SigningOut的中间状态时,不允许执行登录操作,否则就会抛出「由于对象的当前状态,操作无效」的错误。

下面给你几个可行的解决方案:

1. 等待异步登出完成后再执行登录

BeginSignOut是异步方法,必须调用EndSignOut来完成整个登出流程。你可以在登出的回调里完成收尾,再触发登录逻辑:

try {
    if (_LyncClient.State == ClientState.SignedIn) {
        _LyncClient.BeginSignOut(ar => {
            try {
                // 完成异步登出操作,这一步是必须的
                _LyncClient.EndSignOut(ar);
                // 登出完成后,执行登录逻辑
                StartSignInProcess();
            }
            catch (Exception ex) {
                // 处理登出过程中出现的异常
                Console.WriteLine($"登出失败: {ex.Message}");
            }
        }, null);
    }
    else {
        // 如果已经处于未登录状态,直接启动登录
        StartSignInProcess();
    }
}
catch (Exception ex) {
    Console.WriteLine($"处理登出前置检查失败: {ex.Message}");
}

// 封装的登录方法
private void StartSignInProcess() {
    // 先检查当前状态是否允许登录
    if (_LyncClient.State != ClientState.SignedOut && _LyncClient.State != ClientState.SignInRequired) {
        Console.WriteLine($"当前状态{_LyncClient.State}不允许登录");
        return;
    }

    try {
        // 替换为你的账号信息
        _LyncClient.BeginSignIn(
            "your-username",
            "your-password",
            "your-domain",
            ar => {
                try {
                    _LyncClient.EndSignIn(ar);
                    Console.WriteLine("登录成功");
                }
                catch (Exception ex) {
                    Console.WriteLine($"登录失败: {ex.Message}");
                }
            },
            null
        );
    }
    catch (Exception ex) {
        Console.WriteLine($"发起登录请求失败: {ex.Message}");
    }
}

2. 利用StateChanged事件监听状态流转

你已经注册了StateChanged事件,可以通过这个事件精准捕捉到客户端完全登出的状态,再触发登录:

private void _LyncClient_StateChanged(object sender, ClientStateChangedEventArgs e) {
    Console.WriteLine($"客户端状态变化: {e.OldState} -> {e.NewState}");
    
    // 当状态变为SignedOut时,启动登录
    if (e.NewState == ClientState.SignedOut) {
        StartSignInProcess();
    }
    
    // 可选:如果处于SigningOut状态,可以禁用登录按钮或阻止登录请求
    if (e.NewState == ClientState.SigningOut) {
        // 标记当前正在登出,禁止发起登录
        _isSigningOut = true;
    }
}

3. 额外的注意事项

  • 状态检查前置:每次调用BeginSignIn前,一定要检查当前客户端状态是否为SignedOut或SignInRequired,这两个状态是唯一允许发起登录的状态。
  • 避免并发操作:可以加一个布尔标记(比如_isProcessingAuth),在登出或登录过程中标记为true,防止重复触发操作,避免状态混乱。
  • 异常兜底:在BeginSignIn和BeginSignOut的回调里一定要用try-catch包裹EndXXX方法,异步操作的异常只会在调用EndXXX时抛出。

内容的提问来源于stack exchange,提问作者urlreader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:49:53