我正在用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恢复(在等待之后)。此星座引发Exception。但我无法确切地说出原因...

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

这是修改后的代码片段:

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

感谢Geoff将我带到正确的路径上:)
我希望我能帮助也有这个问题的人。

09-25 20:39