8

I've reviewed the documentation for Xamarin, and it recommends using ThreadPool for multithreaded functionality, as can be seen here:

http://docs.xamarin.com/guides/ios/application_fundamentals/threading

However, a benchmark has been done showing that Grand Central Dispatch is much more performant than ThreadPool

http://joeengalan.wordpress.com/2012/02/26/execution-differences-between-grand-central-dispatch-and-threadpool-queueuserworkitem-in-monotouch/

Therefore my question is, why does Xamarin recommend ThreadPool over Grand Central Dispatch? Is Xamarin eventually going to tie ThreadPool into Grand Central Dispatch? When would one choose one over the other? Because if ThreadPool is going to be optimized by Xamarin, and eventually outperform Grand Central Dispatch, then I do not want to use Grand Central Dispatch.

4

2 回答 2

12

通过引入更多线程,您可以从机器(尤其是移动设备)中挤出很少的“额外性能”。

就像我对您链接的那篇文章的评论所说(从 2012 年 2 月开始)以及您链接的文章的第一段解释了原因。

GCD 和 ThreadPool 之间的区别在于 Mono 中的 ThreadPool 有一个“慢启动”设置,因此它不会在工作高峰出现时创建不必要的线程。您可以通过启动太多线程轻松地使 CPU 处于饥饿状态,因此线程池在创建初始线程后会自行限制,然后尝试每秒仅创建一个新线程(给予或接受,我不记得实际细节)。

如果您想强制 ThreadPool 实际启动大量线程,您可以使用 ThreadPool.SetMinThreads 进行控制。

使用 ThreadPool 的原因是相同的代码将适用于所有平台。

请注意,该文档讨论了在其他标准 .NET 线程 API 上使用 ThreadPool没有说明是否使用 GCD。只是线程池是比使用线程滚动您自己的管理更好的选择。

也就是说,就 API 而言,这些天我建议人们使用任务并行库 (TPL),这是一种比线程更高级的后台操作思考方式。此外,您可以通过切换一行代码灵活地使用内置线程池或分派到 GCD,从而获得跨平台的相同 API。

于 2013-05-29T13:57:38.143 回答
2

mono ( ) 线程池的当前问题xamarin是它不执行。

调试器Xamarin会被最少 10 个同时执行的任务阻塞。在发布时也好不到哪里去。

在我的情况下,Windows 上的相同代码在 Mac 10x 或更高版本上的表现优于(注意我没有使用任何特定于系统的代码)。我尝试了线程池、异步方法和异步回调(BeginRead 等)的不同组合——Xamarin 完全解决了这些问题。

如果我不得不猜测这与他们对 IOS 本质上是单线程的痴迷有关。至于他们推荐它,我也有一个猜测——就多线程而言,这是框架中唯一有效的部分。

我花了数周时间试图优化我的代码,但如果你使用多线程,你就无能为力了。

于 2014-06-23T11:03:15.507 回答