gpt4 book ai didi

c# - StreamSocket TCP 的 WinRT : DataReader. LoadAsync 异常

转载 作者:太空狗 更新时间:2023-10-29 22:32:58 25 4
gpt4 key购买 nike

我正在使用 C# 在 WinRT 上编写一个客户端应用程序,它通过 TCP 连接到多个服务器。对于 TCP 连接,我使用 StreamSocket。然后将输入和输出字符串包装在 DataWriter 和 DataReader 中。当我连接到多个服务器时,出现以下异常:“操作标识符无效”

这是方法的代码:

private async void read()
{
while (true)
{
uint bytesRead = 0;
try
{
bytesRead = await reader.LoadAsync(receiveBufferSize);

if (bytesRead == 0)
{
OnClientDisconnected(this);
return;
}
byte[] data = new byte[bytesRead];
reader.ReadBytes(data);
if (reader.UnconsumedBufferLength > 0)
{
throw new Exception();
}

OnDataRead(this, data);
}
catch (Exception ex)
{
if (Error != null)
Error(this, ex);
}

new System.Threading.ManualResetEvent(false).WaitOne(10);

}
}

Stacktrace 仅将 reader.LoadAsync(UInt32 count) 方法显示为问题的根源。每个 ClientInstance 都在自己的任务中运行,并拥有自己的 DataReader 和 Stream 实例。 “receiveBufferSize”为 8192 字节。

您知道错误可能是什么吗?

最佳答案

我想我现在可以自己回答我的问题了。问题是 LoadAsync 方法不能很好地与 await/async 构造一起使用。该方法由 ThreadPool 线程 A 调用,然后由 ThreadPool 线程 B 恢复(在 await 之后)。此星座抛出异常。但我不能确切地说出为什么...

有了这个答案 ( How to integrate WinRT asynchronous tasks into existing synchronous libraries? ),我将 LoadAsync 方法写入同步方法,现在它可以工作了,因为同一个线程正在调用该方法并使用它的结果。

修改后的代码片段:

IAsyncOperation<uint> taskLoad = reader.LoadAsync(receiveBufferSize);
taskload.AsTask().Wait();
bytesRead = taskLoad.GetResults();

感谢 Geoff 带我走上正确的线程之路 :)我希望我能帮助同样(将)遇到此问题的人。

关于c# - StreamSocket TCP 的 WinRT : DataReader. LoadAsync 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16110561/

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