C#学习教程:WinRT使用StreamSocketTCP:DataReader.LoadAsyncexception对于TCP连接,我使用StreamSocket。然后将输入和输出字符串包装在DataWriter和DataReader中。当我连接到多个服务器时,出现以下异常:“操作标识符无效”这是该方法的代码:privateasyncvoidread(){while(true){uintbytesRead=0;尝试{bytesRead=等待读者。LoadAsync(接收缓冲区大小);如果(bytesRead==0){OnClientDisconnected(this);返回;}byte[]data=newbyte[bytesRead];reader.ReadBytes(数据);如果(reader.UnconsumedBufferLength>0){thrownewException();}OnDataRead(这个,数据);}catch(Exceptionex){if(Error!=null)Error(this,ex);}newSystem.Threading.ManualResetEvent(false).WaitOne(10);}}Stacktrace仅将reader.LoadAsync(UInt32count)方法显示为问题的根源。每个ClientInstance在其自己的任务中运行,并具有自己的DataReader和Stream实例。“receiveBufferSize”是8192字节。你知道错误是什么吗?我想我现在可以自己回答我的问题了。问题是LoadAsync方法不能很好地与await/async构造一起使用。ThreadPool线程A调用此方法,然后由ThreadPool线程B恢复(等待后)。这个星座抛出异常。但我不能确切地说出为什么......有了这个答案(HowtointegrateWinRTasynchronoustasksintoanexistingsynchronouslibrary?)使用它的结果。这是修改后的代码片段:IAsyncOperationtaskLoad=reader.LoadAsync(receiveBufferSize);taskload.AsTask().Wait();bytesRead=taskLoad.GetResults();感谢Geoff让我在线程方面走上正轨:)我希望我能帮助那些也(将)解决这个问题的人。在我看来,异常的可能原因是文档中的这一部分:当先前对LoadAsync的调用尚未完成时。进一步阅读:LoadAsync方法只能在UI线程上调用一次。在引发LoadCompleted事件之前,无法再次调用该方法。无论查询是否成功,都会引发LoadCompleted事件。然后,结合这个非常详尽的答案,为什么async/await不只是纯粹的魔术酱:[...]await不会神奇地导致同步方法异步运行。例如,它不会启动一个新线程并在新线程上运行该方法。所以看起来第二次调用LoadAsync()发生在第一次完成之前;两者都来自同一个UI线程。以上就是C#学习教程:WinRTusingStreamSocketTCP:DataReader.LoadAsyncexception分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
