c# – 这是异步读数吗?

c# – 这是异步读数吗?,第1张

概述我有一个listen()函数,它正在读取网络流和一个回调函数newDataRecievedCallback. 我调用了一个方法BeginRead,它是Async,但我再次在回调函数中调用相同的方法.那不是同步逻辑吗? 还有其他方法吗? private void listen() { networkStream.BeginRead(buffer, 0, buffer.Leng 我有一个Listen()函数,它正在读取网络流和一个回调函数newDataRecIEvedCallback.

我调用了一个方法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# – 这是异步读数吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217346.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存