Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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

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# TAP和async/await是否用于专用线程?_C#_Multithreading_Concurrency_Async Await_Task - Fatal编程技术网

C# TAP和async/await是否用于专用线程?

C# TAP和async/await是否用于专用线程?,c#,multithreading,concurrency,async-await,task,C#,Multithreading,Concurrency,Async Await,Task,我有一些线程专用于一个任务(接收和处理请求),还有一些线程专用于其他任务(长时间运行/CPU密集型任务)。 这是一个控制台应用程序 我想在所有线程中使用async/await,但我了解到async/await使用继续运行,这意味着请求处理可能会延迟,因为出现了大量CPU密集型任务(是的,这么多,这就是为什么我限制了执行此任务的线程数) 如果我想限制并发,那么我不能使用TAP 如果我想在应用程序的一生中做一些后台工作,那么我也不能使用TAP 我应该用自己的SyncronizationContext

我有一些线程专用于一个任务(接收和处理请求),还有一些线程专用于其他任务(长时间运行/CPU密集型任务)。 这是一个控制台应用程序


我想在所有线程中使用async/await,但我了解到async/await使用继续运行,这意味着请求处理可能会延迟,因为出现了大量CPU密集型任务(是的,这么多,这就是为什么我限制了执行此任务的线程数)

  • 如果我想限制并发,那么我不能使用TAP
  • 如果我想在应用程序的一生中做一些后台工作,那么我也不能使用TAP
  • 我应该用自己的SyncronizationContext编写一个ThradPool实现吗
  • 有没有其他方法可以在某些线程集中运行continuation

  • 我想在所有线程中使用async/await,但我了解到async/await使用托管线程池来运行continuation,这意味着请求处理可能会因为出现大量CPU密集型任务而延迟(是的,这么多,这就是为什么我做这项工作的线程数有限)

    这是一个足够严密的分析。从技术上讲,不是
    async
    /
    await
    需要线程池来继续,而是内部TAP方法实现。也就是说,这是BCL中的常见模式,因此,耗尽线程池可能会导致异步完成的延迟

    如果我想限制并发,那么我不能使用TAP

    只要您没有淹没线程池,就可以使用TAP。限制并发将释放线程池,从而启用TAP

    如果我想在应用程序的一生中做一些后台工作,那么我也不能使用TAP

    我认为这更像是“不要把线程池淹没在工作中”。耗尽的线程池对于任何类型的工作都不是很好

    我应该用自己的SyncronizationContext编写一个ThradPool实现吗? 有没有其他方法可以在某些线程集中运行continuation

    您可以使用
    SynchronizationContext
    控制执行
    wait
    恢复的位置,但仍有BCL内部完成需要排队到线程池。这是无法控制的;唯一的实际选择是保持线程池空闲


    我想在所有线程中使用async/await,但我了解到async/await使用托管线程池来运行continuation,这意味着请求处理可能会因为出现大量CPU密集型任务而延迟(是的,这么多,这就是为什么我做这项工作的线程数有限)

    这是一个足够严密的分析。从技术上讲,不是
    async
    /
    await
    需要线程池来继续,而是内部TAP方法实现。也就是说,这是BCL中的常见模式,因此,耗尽线程池可能会导致异步完成的延迟

    如果我想限制并发,那么我不能使用TAP

    只要您没有淹没线程池,就可以使用TAP。限制并发将释放线程池,从而启用TAP

    如果我想在应用程序的一生中做一些后台工作,那么我也不能使用TAP

    我认为这更像是“不要把线程池淹没在工作中”。耗尽的线程池对于任何类型的工作都不是很好

    我应该用自己的SyncronizationContext编写一个ThradPool实现吗? 有没有其他方法可以在某些线程集中运行continuation


    您可以使用
    SynchronizationContext
    控制执行
    wait
    恢复的位置,但仍有BCL内部完成需要排队到线程池。这是无法控制的;唯一的实际选择是保持线程池空闲。

    使用该方法增加
    ThreadPool
    生成的线程的初始数量如何?例如
    ThreadPool.SetMinThreads(100,10)
    @TheodorZoulias我不喜欢这个解决方案,因为请求处理和长时间运行的任务仍然混合在一个线程池中,这仍然会导致没有线程处理请求的情况,因为所有线程都忙于长时间运行的任务。对于长时间运行的任务,我真的不需要那么多线程(3个线程就足够了)。使用该选项启动长时间运行的任务怎么样?顺便说一句,你说的“长时间运行”是指从应用程序的开始到结束,还是仅仅持续几秒钟以上?@TheodorZoulias我不知道TaskCreationOptions。长时间运行,谢谢!一个作业可以持续数小时也可以持续数分钟,但它们会一直持续到应用程序停止为止。
    longlunning
    选项实际上没有什么特别之处。它只是在一个新线程而不是
    ThreadPool
    线程中运行任务。我的猜测是,长时间运行的任务实际上是由于
    Thread.Sleep
    而延迟的循环。如果是这种情况,那么您可以将
    线程.Sleep
    替换为
    等待任务.Delay
    ,并且具有不需要专用线程的长时间运行的任务。是一个例子。使用该方法增加
    ThreadPool
    生成的线程的初始数量如何?例如
    ThreadPool.SetMinThreads(100,10)
    @TheodorZoulias我不喜欢这个解决方案,因为请求处理和长时间运行的任务仍然混合在一个线程池中,这仍然会导致没有线程处理请求的情况,因为所有线程都忙于长时间运行的任务。对于长时间运行的任务,我真的不需要那么多线程(3个线程就足够了)。使用该选项启动长时间运行的任务怎么样?顺便说一句,你说的“长时间运行”是指从应用程序的开始到结束,还是仅仅持续几秒钟以上?@TheodorZoulias我不知道TaskC