【发布时间】:2017-03-06 11:15:03
【问题描述】:
我必须处理 Gb 的文件并使用具有异步方法的库将它们发送到网络来执行此类操作。
如果我执行以下操作,我想如果它们需要一段时间才能完成,我会得到一个同时工作的无限线程数:
void ProcessFiles()
{
string[] files = /*a lot of files */
foreach(file in files)
{
MyAsyncMethod(file)
}
}
async void MyAsyncMethod(string file)
{
string conent = File.ReadAllBytes(file);
await MyLibrary.Async(call)
}
当然应该是运行并发线程数的限制,但是会创建几个线程,性能会变差……应该是创建线程的限制……达到这个限制会发生什么?新线程会在当前线程结束后创建吗?会被忽略吗?程序会抛出异常吗??
如何管理这个“无限”数量的异步调用。我应该将其转换为同步调用(Task.start() + Task.wait())并由我自己的线程池管理吗?
谢谢
【问题讨论】:
-
您确实应该首先运行代码以实际查看它的作用......然后您应该阅读一些关于
await作用的教程,因为您误解了它的作用...... -
Tasks 和async/await的全部意义在于您不必进行线程管理。你不必担心。 -
您似乎对 async/await 的工作原理有些误解。这应该一次只处理一个文件,没有文件的并行读取,因为
await导致当前循环等待(没有阻塞)直到MyLibrary.Async在移动到下一个文件之前完成。类似于编写可枚举方法时的yield return语句。 -
您的代码,就目前而言,正在按顺序对文件进行操作。一旦“等待”被击中,循环就会停止并控制离开这个方法,直到 MyLibrary.Async () 返回。在这一点上,又发生了一次循环迭代,等等。
-
我已经编辑了我的代码,更新了我正在尝试做的代码,但我担心可以创建的线程数量,因为我需要发送数千个不同的文件几天
标签: c# multithreading asynchronous async-await