C# 异步方法调用的无限循环
我必须处理Gb的文件,并使用具有异步方法的库将它们发送到网络以执行此类操作 如果我执行以下操作,我想如果它们需要一段时间才能完成,我将同时获得一个无限线程数:C# 异步方法调用的无限循环,c#,multithreading,asynchronous,async-await,C#,Multithreading,Asynchronous,Async Await,我必须处理Gb的文件,并使用具有异步方法的库将它们发送到网络以执行此类操作 如果我执行以下操作,我想如果它们需要一段时间才能完成,我将同时获得一个无限线程数: void ProcessFiles() { string[] files = /*a lot of files */ foreach(file in files) { MyAsyncMethod(file) } } async void MyAsyncMethod(string file
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())并通过自己的线程池进行管理
谢谢你你不必担心线程,.NET会为你担心的 顺便说一下,您提供的代码是异步的,但按顺序运行:
foreach(string file in files)
{
byte[] content = File.ReadAllBytes(file);
await MyLibrary.AsyncCall(content); //<-- Loop is blocked per this await.
}
至于问题“Dos
Task.WaitAll
为每个任务创建新线程”
,答案是否。(上面的代码最多会使用一个线程,比您正在使用的线程多一个线程。“等待”命令会要求系统进行任务调度,然后在任务完成后返回到循环中。如果任务实际运行在同一个线程或另一个线程上,您就无法指望了
如果您希望并行执行调用,从而利用多个线程(多个CPU内核),则应使用parallel.For。请记住,在不知道具体操作方法的情况下,不应混合使用线程和异步
你真的应该先运行代码来真正了解它的功能…然后你应该阅读一些关于
等待
的教程,因为你误解了它的功能。任务
s和异步
/等待
的要点是你不必做线程管理。你不必担心。哟你似乎对async/await的工作原理有一些误解。它一次只能处理一个文件,因为await
会导致当前循环等待(无阻塞),因此不会并行读取文件直到MyLibrary.Async
完成,然后再转到下一个文件。类似于编写可枚举方法时的yield return
语句。您的代码按顺序对文件进行操作。只要点击“wait”,循环就会停止,控件将此方法保留到MyLibrary.Async()返回。在这一点上,又发生了一次循环迭代,等等。我编辑了我的代码,更新后的代码我正在尝试做什么,但我担心可能会创建的线程数量,因为我需要在某一天发送数千个不同的文件。为什么是向下投票?您刚刚编写的代码导致了OP试图解决的所有问题避免,当他们以前不在那里时。@Servy请说得更具体些。OP想避免什么?请随意阅读问题以了解,尽管将来我建议在你发布答案之前,而不是之后这样做。@Servy我已经阅读了问题。据我所知,OP认为他正在同时发送文件,但事实并非如此关注并行线程的数量。您不应该将parallel
库与async/await
混合使用。它们的设计目的不同purposes@MatiasCicero同意。这正是我所写的。好的,这意味着我发布的示例代码将是有效的??如果响应为“是”,我如何管理并等待所有MyAsyncMethod()如果我没有在for循环中等待它们,调用就结束了。
Task[] tasks = files.Select(File.ReadAllBytes).Select(c => MyLibrary.AsyncCall(c)).ToArray();
Task.WaitAll(tasks); //<-- Will execute concurrently, and get back when they are all done.