Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步方法调用的无限循环_C#_Multithreading_Asynchronous_Async Await - Fatal编程技术网

C# 异步方法调用的无限循环

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

我必须处理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())并通过自己的线程池进行管理


谢谢你

你不必担心线程,.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。请记住,在不知道具体操作方法的情况下,不应混合使用线程和异步

  • 如果调用确实需要一个线程,系统将为您管理一个线程池,而不是产生无尽的线程

  • 在许多情况下,.Asynchronous不是多线程的同义词。多线程是一种用于异步执行任务的技术,但它不是唯一的方法


  • 你真的应该先运行代码来真正了解它的功能…然后你应该阅读一些关于
    等待
    的教程,因为你误解了它的功能。
    任务
    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.