我调用了一个方法BeginRead,它是Async,但我再次在回调函数中调用相同的方法.那不是同步逻辑吗?
还有其他方法吗?
private voID Listen() { networkStream.BeginRead(buffer,buffer.Length,new AsyncCallback(newDataRecIEvedCallback),null); } private voID newDataRecIEvedCallback(IAsyncResult rst) { try { int recIEvedDataSize = tcpClIEnt.ClIEnt.Receive(buffer); recIEvedData = convertToString(buffer,incomeDataSize); //End Read networkStream.EndRead(rst); cleanBuffer(); parseXMLData(recIEvedData); //HIEr I call the same async method networkStream.BeginRead(buffer,null); } catch (Exception ex) { Console.Writeline(ex.Message); } }解决方法 如果BeginRead总是异步完成,那么在回调中再次调用它仍然是异步的.
但是,BeginRead有时会同步完成(检查IAsyncResult.CompletedSynchronously),因此当您运气不好时,您的代码很容易受到堆栈溢出的影响.例如,这可能发生在一个线程中:newDataRecIEvedCallback – > BeginRead – > newDataRecIEvedCallback – > BeginRead等等.
使用BeginRead的正确方法是使用类似于下面的模式(在Nutshell中这是来自C#4.0的code snippet).实质上,您应该始终检查方法是否同步完成,然后采取适当的行动.
voID Read() // Read in a nonblocking fashion.{ while (true) { IAsyncResult r = _stream.BeginRead (_data,_bytesRead,_data.Length - _bytesRead,ReadCallback,null); // This will nearly always return in the next line: if (!r.CompletedSynchronously) return; // Handled by callback if (!EndRead (r)) break; } Write();}voID ReadCallback (IAsyncResult r){ try { if (r.CompletedSynchronously) return; if (EndRead (r)) { Read(); // More data to read! return; } Write(); } catch (Exception ex) { ProcessException (ex); }}bool EndRead (IAsyncResult r) // Returns false if there’s no more data{ int chunkSize = _stream.EndRead (r); _bytesRead += chunkSize; return chunkSize > 0 && _bytesRead < _data.Length; // More to read}总结
以上是内存溢出为你收集整理的c# – 这是异步读数吗?全部内容,希望文章能够帮你解决c# – 这是异步读数吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)