使用Task.Run进行IO操作

时间:2013-07-22 18:47:32

标签: .net io .net-4.5 monogame winrt-async

我正在使用MonoGame,但这与winrt async和IO有关,所以请不要重定向到gamedev。

我想异步加载游戏内容,以便我可以更新加载屏幕的进度。我将每个ContentManager.Load调用放在一个Task中,然后在我的BeginLoading方法中,我只是遍历所有任务并一次性启动它们。

到目前为止,这似乎与我的测试有关,但我的问题是这是否会扩展。

如果我为异步添加100个资产,这将分离100个同时从磁盘al读取的任务。 WinRT会这样缩放吗?

事实上,我应该将任务数量限制为核心/物理踏板的数量吗?或者我应该只有一个活动的任务?

1 个答案:

答案 0 :(得分:1)

创建100个任务不一定会启动所有同时执行的100个并发线程。您可以限制可用的池线程数,也可以限制TPL的内容是同时运行的合理数量的任务。在4核计算机上,您可能不会获得超过三到四个并发任务。

也就是说,你可能最好开始一个任务,然后迭代你的资产列表并一次加载一个。由于多个线程向同一个驱动器发出I / O请求,这些线程很可能会花费大量时间在磁盘上等待并且不会对并发处理做很多事情。由于许多线程都在进行加载,因此他们大部分时间都处于闲置状态。我发现你的多个加载器线程需要更长的时间才能完成,而不是你启动一个一次加载所有资产的线程。

我不知道如何创建100个单独的任务,每个任务加载单个资产,比按顺序加载这100个资产的单个任务更容易编码。我想不出你如何创建这样的数据结构。

简而言之,您不必将任务数限制为可用核心数; TPL会为您做到这一点。但是你可能最好只完成一项任务。最好的情况是,使用多个并发线程,你的略微更好,但这不太可能。