gpt4 book ai didi

c# - Windows 应用商店应用程序 StreamSoket DataReader.LoadAsync() ObjectDisposedException

转载 作者:太空狗 更新时间:2023-10-29 23:32:59 26 4
gpt4 key购买 nike

我在使用 Windows 8 UI 应用程序时遇到问题。我正在使用客户端-服务器通信,客户端需要一直检查新消息。所以我使用这样的代码,其中 _socket 是一个 StreamSoket:

    private async static void MessageReceiver()
{
var dataReader = new DataReader(_socket.InputStream);
dataReader.InputStreamOptions = InputStreamOptions.Partial;

var stringHeader = await dataReader.LoadAsync(4);
if (stringHeader != 0)
{
var bytes = new byte[4];
dataReader.ReadBytes(bytes);
var length = BitConverter.ToInt32(bytes, 0);

var count = await dataReader.LoadAsync((uint) length);

var result = dataReader.ReadString(count);

ParseRequest(result);
}

dataReader.DetachStream();


MessageReceiver();
}

但是在第二个 LoadAsync 中,当我尝试读取字符串时,出现了 ObjectDisposedException。你能帮我吗?我不知道为什么会抛出这样的异常。我也尝试过使用 DataReader.InputStream.ReadAsync(),但我也有这样的问题。

最佳答案

我知道这是一篇旧帖子,但由于我遇到了同样的问题并弄明白了,所以我想我会为其他遇到此问题的人发布解决方案。虽然我不会声称知道这个问题的确切原因是什么,但由于我主要是 C++ 人员,所以解决方案相当简单。

我修复它的方法是将 DataReader 声明为类成员,从而扩展它的范围

_socket= new StreamSocket();
_socket.Control.KeepAlive = true;
_socket.Control.NoDelay = true;
_socketReader = new DataReader(_socket.InputStream);
_socketReader.InputStreamOptions = InputStreamOptions.Partial;

我对 await 关键字可能不正确的理解是调用基本上放在一个新线程上,而该函数的其余部分将在前一个线程上继续。由于 DataReader 是在本地声明的,一旦函数完成,它将超出范围,让等待线程处理已释放的对象。

如果有人想澄清这一点,我们将不胜感激。

关于c# - Windows 应用商店应用程序 StreamSoket DataReader.LoadAsync() ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com