最近有点混乱,socket.sendasync=false是如何触发的?有必要在这步进行事件处理吗?还是等待下次sendasync=ture时触发事件?

ff167 2010-10-17 09:32:19
我被这个方法弄得有点晕

看msdn,它返回false时不会触发事件,所以我工作上看到一些代码里有手动调用处理结果(iocompleted时)的事件

但是我看很多高性能代码,里面都不用手动调用事件,而是让数据继续发送,等待异步结果。

弄得我现在有点搞混了,这个false怎么触发,有必要在触发时去做调用事件吗?还是继续传输等待就可以了?

我现在怀疑我工作上看的那些代码(也就是手动调completed事件的),似乎会出现多线程的问题,导致出现一些误报的异常。但是对这个方法不熟悉,弄得一头烟。
...全文
453 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Roger370 2011-06-13
  • 打赏
  • 举报
回复
哇撒,从来没听说过的东西,干吗用的?
mymy3697166 2011-06-13
  • 打赏
  • 举报
回复
期待中。。。。。。。。。。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ff167 的回复:]
谢谢,这个我知道,但是我不清楚的是sendasync返回false时,到底有没必要去触发本来应该在sendasync=ture时引发的事件。
[/Quote]

你在#1楼问题中所说的,也根本没有触发那个事件,而不过是调用了事件处理方法相同的代码而已。如果把“触发事件”这个词滥用,误导了别人更误导了自己。
warfen 2011-01-19
  • 打赏
  • 举报
回复
SendAsync是SocketAsyncEventArgs中的一个方法,SocketAsyncEventArgs提供异步操作,这些方法都是 异步的,但是!还有很小的几率 这些方法同步完成了(返回false)。因为是同步完成,所以,就不触发 异步回调事件,这个时候,需要 自己做处理。(其实处理方法都是一样的)。
ff167 2010-10-18
  • 打赏
  • 举报
回复
自己提一下
xu_2007 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xu_2007 的回复:]
楼主朋友应该是用socketasyncevent这个高性能类吧,对于这个类它的接收和发送以及连接(completed)事件都不是自己手动触发的,而是系统根据异步或同步判断而调用的,对于同步的则需要我们自己调用逻辑处理涵数,而异步的则会自动触发(completed)事件,但具体的处理逻辑还是需要在这个事件中编写的,这个事件只是系统告诉我们是否完成了某个发送或接收或连接的异步处理。对于socket.s……
[/Quote]

对于socket.sendasync这个里面的sendasync这个属性只是判断是否执行了发送事件而已。

这句更正一下,这个属性如果返回假表示是同步执行的,返回真则是异步执行的,如果为异步执行的那么系统会自动调用(completed)事件; 如果返回假的话,则和我上面说的,你需要自己调用逻辑处理函数!
xu_2007 2010-10-18
  • 打赏
  • 举报
回复
楼主朋友应该是用socketasyncevent这个高性能类吧,对于这个类它的接收和发送以及连接(completed)事件都不是自己手动触发的,而是系统根据异步或同步判断而调用的,对于同步的则需要我们自己调用逻辑处理涵数,而异步的则会自动触发(completed)事件,但具体的处理逻辑还是需要在这个事件中编写的,这个事件只是系统告诉我们是否完成了某个发送或接收或连接的异步处理。对于socket.sendasync这个里面的sendasync这个属性只是判断是否执行了发送事件而已。

本人最近也在看这个类,但学习的不是很深入,如果上面有说错的地方请指证!
ff167 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
Socket作为长连接,发送和接受,在保持连接时,会发送Request包和Response包保持连接处于激活状态。
不管是服务端还是客户端,一个 Socket 在连接后就不能再次 Connect 了
在连接保持正常状态下,调用SendAsync(args)和ReceiveAsync(e)发送和接受信息。
[/Quote]

谢谢,这个我知道,但是我不清楚的是sendasync返回false时,到底有没必要去触发本来应该在sendasync=ture时引发的事件。
缭绕飘渺 2010-10-17
  • 打赏
  • 举报
回复
不了解
帮顶。顺便学习
wuyq11 2010-10-17
  • 打赏
  • 举报
回复
Socket作为长连接,发送和接受,在保持连接时,会发送Request包和Response包保持连接处于激活状态。
不管是服务端还是客户端,一个 Socket 在连接后就不能再次 Connect 了
在连接保持正常状态下,调用SendAsync(args)和ReceiveAsync(e)发送和接受信息。
ff167 2010-10-17
  • 打赏
  • 举报
回复
那个事件是对发送的流长度的对比,同时里面还有一个对队列的发送的处理(如果还需要发送,会在iocompleted时再用sendasync传没有传递的包……)

这个方式一般没错,但是有时候会报发送的流长度和应该发送的流长度不等。

我检查过似乎没有多线程对buffer进行处理,所以在怀疑是不是这个地方的调用出了问题。不过在测试时很难引发这个错误。
qldsrx 2010-10-17
  • 打赏
  • 举报
回复
sendasync返回false时,不会自动触发事件,不过你要手动去引发事件处理过程的话,必须看清楚该过程是否可以同时在同步和异步情况下执行,sendasync返回false时是同步的情况,返回true时时异步的情况。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧