求助,Start方法卡住,或await StartAsync方法后调用session的任意方法也都会一直卡住 #44
-
全局 private CqWsSession _session; //全局 连接方法 public async Task Connect(long qqId, string ip, ushort port, string accessToken)
{
_session = new CqWsSession(new CqWsSessionOptions()
{
BaseUri = new Uri($"ws://{ip}:{port}"), // WebSocket 地址
AccessToken = accessToken,
UseApiEndPoint = true, // 使用 api 终结点
UseEventEndPoint = true, // 使用事件终结点
});
await _session.StartAsync(); //如果不使用Async方法,在这里就会卡住
//使用Async方法后调用以下任意方法也都会卡住
//string nickname = _session.GetFriendList()?.Friends.Where(f => f.UserId == qqId).FirstOrDefault()?.Nickname ?? "未知";
string nickname = _session.GetLoginInformation()?.Nickname ?? "未知";
} 调用Start或者StartAsync方法时gocq上都能正常出现接受xx端口连接的打印 |
Beta Was this translation helpful? Give feedback.
Answered by
SlimeNull
Jun 3, 2023
Replies: 1 comment
-
这可能是因为死锁问题. 如果你在一个 async 方法中尝试使用同步的方法, 则可能导致死锁. 大概如下: 一个多个 async 异步方法总会尽可能的利用少的线程, 这就意味着, 他的执行是依赖于 "上下文切换" 的. 如果在这里, 调用同步方法, 那么整个线程会被阻塞, 从而没办法切换到另外一个正在执行的异步任务中. 如果你等待的任务正好是将要执行的异步任务, 那么就会造成死锁. 建议是: 要么全局使用同步, 要么全局使用异步. 感谢你提到这件事, 我会将它添加到 readme 中的 |
Beta Was this translation helpful? Give feedback.
0 replies
Answer selected by
SlimeNull
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
这可能是因为死锁问题. 如果你在一个 async 方法中尝试使用同步的方法, 则可能导致死锁.
大概如下: 一个多个 async 异步方法总会尽可能的利用少的线程, 这就意味着, 他的执行是依赖于 "上下文切换" 的. 如果在这里, 调用同步方法, 那么整个线程会被阻塞, 从而没办法切换到另外一个正在执行的异步任务中. 如果你等待的任务正好是将要执行的异步任务, 那么就会造成死锁.
建议是: 要么全局使用同步, 要么全局使用异步.
感谢你提到这件事, 我会将它添加到 readme 中的