首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从NetworkStream调用BeginRead

从NetworkStream调用BeginRead
EN

Stack Overflow用户
提问于 2011-11-11 01:17:33
回答 1查看 20.9K关注 0票数 4

好的,我想使用System.Net.Sockets.NetworkStream类连接到Socket并读取网络流。这就是我到目前为止所知道的:

代码语言:javascript
复制
NetworkStream myNetworkStream;
Socket socket;

socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, 
    ProtocolType.IPv4);
socket.Connect(IPAddress.Parse("8.8.8.8"), 8888);

myNetworkStream = new NetworkStream(socket);

byte[] buffer = new byte[1024];
int offset = 0;
int count = 1024;

myNetworkStream.BeginRead(buffer, offset, count, ??, ??);

现在我需要一个AsyncCallback和一个Object state来完成我的BeginRead方法,但我甚至不确定这是否可以工作。我在这一点上有点迷失了!从这里我需要去哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-11 04:09:01

基本上,当您在异步操作上调用Begin*方法时,需要调用相应的End*语句(有关更详细的信息,请参阅Asynchronous Programming Overview on MSDN,特别是标题为“结束异步操作”的部分)。

也就是说,您通常希望传递一个方法/匿名方法/lambda表达式,它将做一到两件事:

1)调用对应的End*方法,本例中为Stream.EndRead。此调用在被调用时不会阻塞,因为在操作完成之前不会调用callback (请注意,如果在异步调用期间发生异常,则在调用End*方法时将抛出此异常)。

2)可能会启动一个新的异步调用。在本例中,假设您希望读取更多数据,因此应该启动对Stream.BeginRead的新调用

假设你想做第二件事,你可以做以下事情:

代码语言:javascript
复制
// Declare the callback.  Need to do that so that
// the closure captures it.
AsyncCallback callback = null;

// Assign the callback.
callback = ar => { 
    // Call EndRead.
    int bytesRead = myNetworkStream.EndRead(ar);

    // Process the bytes here.


    // Determine if you want to read again.  If not, return.
    if (!notMoreToRead) return;

    // Read again.  This callback will be called again.
    myNetworkStream.BeginRead(buffer, offset, count, callback, null);
};

// Trigger the initial read.
myNetworkStream.BeginRead(buffer, offset, count, callback, null);

但是,如果您使用的是.NET 4.0,那么在TaskFactory class上使用FromAsync method就会变得容易得多。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8083592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档