多个工作线程与一个具有异步/等待功能的工作线程

Hengyi

我的代码当前具有以下10个工作线程。每个工作线程继续从队列中轮询作业,然后处理长时间运行的作业。

for (int k=0; k<10; k++)
{
  Task.Factory.StartNew(() => DoPollingThenWork(), TaskCreationOptions.LongRunning);
}

void DoPollingThenWork()
{
  while (true)
  {
    var msg = Poll();
    if (msg != null)
    {
      Thread.Sleep(3000); // process the I/O bound job
    }
  }
}

我正在重构底层代码以使用异步/等待模式。我想我可以将上面的代码重写为以下代码。它使用一个主线程继续创建异步任务,并使用SemaphoreSlim将并发任务的数量限制为10。

Task.Factory.StartNew(() => WorkerMainAsync(), TaskCreationOptions.LongRunning);

async Task WorkerMainAsync()
{
  SemaphoreSlim ss = new SemaphoreSlim(10);
  while (true)
  {
    await ss.WaitAsync();
    Task.Run(async () => 
              {
                await DoPollingThenWorkAsync();
                ss.Release();
              });
  }
}

async Task DoPollingThenWorkAsync()
{
  var msg = Poll();
  if (msg != null)
  {
    await Task.Delay(3000); // process the I/O-bound job
  }
}

两者的行为应相同。但是我认为第二种选择似乎更好,因为它不会阻塞线程。但不利的一面是我无法等待(优雅地停止任务),因为任务就像是一发不可收拾。第二种选择是否是替代传统工作线程模式的正确方法?

斯威克

当您拥有异步代码时,通常没有理由使用Task.Run()(甚至更糟的是Task.Factory.StartNew())。这意味着您可以将代码更改为以下内容:

await WorkerMainAsync();

async Task WorkerMainAsync()
{
  SemaphoreSlim ss = new SemaphoreSlim(10);
  while (true)
  {
    await ss.WaitAsync();
    // you should probably store this task somewhere and then await it
    var task = DoPollingThenWorkAsync();
  }
}

async Task DoPollingThenWorkAsync(SemaphoreSlim semaphore)
{
  var msg = Poll();
  if (msg != null)
  {
    await Task.Delay(3000); // process the I/O-bound job
  }

  // this assumes you don't have to worry about exceptions
  // otherwise consider try-finally
  semaphore.Release();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当工作线程具有异常时,关闭ThreadPoolExecutor

来自分类Dev

多个工作线程与一个异步/等待的工作线程

来自分类Dev

将工作从多个线程分派到一个同步线程

来自分类Dev

具有工作线程的WCF服务

来自分类Dev

在等待另一个线程完成工作时取消阻塞主线程

来自分类Dev

如果仍然有异步方法在运行,那么另一个线程会使用无状态会话吗?

来自分类Dev

一个线程中是否有多个等待以相同的任务按FIFO顺序恢复?

来自分类Dev

等待多个线程得到一个结果

来自分类Dev

一个线程等待多个线程事件

来自分类Dev

NodeJS中没有异步功能的等待如何工作?

来自分类Dev

具有异步/等待功能的npm mv模块

来自分类Dev

Clojure使用零或一个输入运行具有功能的多个线程

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

带有异步问题的线程

来自分类Dev

当工作线程具有异常时,关闭ThreadPoolExecutor

来自分类Dev

具有工作线程的WCF服务

来自分类Dev

在等待另一个线程完成工作时取消阻塞主线程

来自分类Dev

在另一个线程上异步/等待有什么好处吗?

来自分类Dev

如何将一个文件拆分为具有多个线程的多个文件?

来自分类Dev

等待线程池中启动的异步工作流

来自分类Dev

Visual C ++只有一个线程在工作(OpenMP)

来自分类Dev

一个线程有多个启动

来自分类Dev

为什么只有一个工作线程的ThreadPoolExecutor仍然比正常执行更快?

来自分类Dev

如何在一个工作线程中运行多个异步任务?

来自分类Dev

Spark 在具有多个应用程序的工作线程上运行了多少个 JVM

来自分类Dev

等到另一个线程在 jQuery 中工作

来自分类Dev

一个线程是否与具有相同 id 的前一个线程同步?

Related 相关文章

  1. 1

    当工作线程具有异常时,关闭ThreadPoolExecutor

  2. 2

    多个工作线程与一个异步/等待的工作线程

  3. 3

    将工作从多个线程分派到一个同步线程

  4. 4

    具有工作线程的WCF服务

  5. 5

    在等待另一个线程完成工作时取消阻塞主线程

  6. 6

    如果仍然有异步方法在运行,那么另一个线程会使用无状态会话吗?

  7. 7

    一个线程中是否有多个等待以相同的任务按FIFO顺序恢复?

  8. 8

    等待多个线程得到一个结果

  9. 9

    一个线程等待多个线程事件

  10. 10

    NodeJS中没有异步功能的等待如何工作?

  11. 11

    具有异步/等待功能的npm mv模块

  12. 12

    Clojure使用零或一个输入运行具有功能的多个线程

  13. 13

    具有异步/等待的递归setTimeout

  14. 14

    具有异步/等待的递归setTimeout

  15. 15

    具有异步/等待的递归setTimeout

  16. 16

    带有异步问题的线程

  17. 17

    当工作线程具有异常时,关闭ThreadPoolExecutor

  18. 18

    具有工作线程的WCF服务

  19. 19

    在等待另一个线程完成工作时取消阻塞主线程

  20. 20

    在另一个线程上异步/等待有什么好处吗?

  21. 21

    如何将一个文件拆分为具有多个线程的多个文件?

  22. 22

    等待线程池中启动的异步工作流

  23. 23

    Visual C ++只有一个线程在工作(OpenMP)

  24. 24

    一个线程有多个启动

  25. 25

    为什么只有一个工作线程的ThreadPoolExecutor仍然比正常执行更快?

  26. 26

    如何在一个工作线程中运行多个异步任务?

  27. 27

    Spark 在具有多个应用程序的工作线程上运行了多少个 JVM

  28. 28

    等到另一个线程在 jQuery 中工作

  29. 29

    一个线程是否与具有相同 id 的前一个线程同步?

热门标签

归档