增加Monotouch中的ThreadPool线程数?

时间:2012-05-04 09:22:03

标签: c# ios sockets xamarin.ios asyncsocket

我使用套接字为我的应用编写了网络代码。我在Windows PC上测试了这个库,它非常快。无论是很多小的“数据包”(通过数据包,我的意思是发送操作,我使用的是流式传输的TCP)数据在很短的时间内,或者几个大数据包,它都能很好地工作。

我将代码移动到iPhone的测试应用程序中。跑了测试,又恢复了很快的速度。在大约3秒钟内通过wifi在两部手机之间发送大约5 MB。

我在线程池线程中使用同步Socket.Send()操作,并使用ReceiveAsync()进行接收。 (我也尝试过BeginReceive()样式,但它的行为相同。

然而,一旦我将代码移动到我的应用程序中,我就开始遇到问题。一般的问题是接收应用程序似乎没有一致地收到。我可以从主机电话发送几个“数据包”数据,它可以在它们出现在接收端之前的瞬间,几秒到10分钟之间。我已经解决了这个问题2个星期了(晚上/周末),我花了几天时间对它进行测试,试着准确理解我能做些什么才能重现它,但它从来没有相同过两次。

目前,我把它放到线程池线程耗尽。我用过

ThreadPool.SetMaxThreads()

大幅增加线程数,但它没有任何区别。就好像SocketAsyncEventArgs中完成的回调无法获取操作的线程一样,所以它就在那里。我已经完成了我的代码并重构了任何不一定使用线程执行周期性任务并将其更改为定时器的任何内容,但问题仍然存在。

我真的不知道从哪里转过来。我希望它可能是Monotouch中的一个错误(不是我试图责怪那些人!)。

我不确定要发布什么代码,因为网络代码已经自行测试并且运行正常。我用1,000,000发送/接收测试它来检查是否有某种泄漏,但没有发现任何问题。

似乎数据正在接收到收件人,但是回调在某种程度上被调用严重延迟,有时候几分钟。

有人能指出我可能发生这种情况的方向吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

我的问题是由于GKSession也被初始化了。我希望这是Monotouch / Mono中的一个可以修复的错误,因为我需要启用两个网络功能。一旦我禁用了GKSession,套接字代码就会自由流动。