【问题标题】:how to run two different asynchronous methods in different threads c# [duplicate]如何在不同的线程c#中运行两种不同的异步方法[重复]
【发布时间】:2020-12-16 14:04:39
【问题描述】:

我有一个场景,在我的 .Net 标准项目中,我有一个 api

public async Task SendMessageAsync(){

    await _service1.SendmessageToRestServiceAsync(); - calls a rest service

    await _service2.SendMessageToKafkaAsync(); - calls a kakfaclient
}

SDK 用户同时使用该服务的次数接近 100,100 次并报告性能问题。

var tasks  = Enumerable.Range(1, 100).Select(i =>SendMessageAsync());
await Task.WhenAll(tasks);

我想跑步 await _service1.SendMessage(); 在某种程度上,即使有异常也不应该停止 await _service2.SendMessage();

由于此调用始终是强制性的,因此不应受到影响。为 await _service1.Sendmessage() 发出的所有并发请求;应该在后台线程或其他线程上运行,以免影响性能。

我确实检查了接受委托但返回类型为 void 的 ThreadPool.QueueWorkItem。

有没有办法运行所有的调用来等待 _service1.Sendmessage();在后台。执行顺序并不重要。

链接中的文档显示“创建一个将在所有提供的任务完成后完成的任务。” SendMessageAsync 已经在 whenall 中调用了。 我的问题是有一种方法,对 SendmessageToRestServiceAsync 的调用可以独立于其他任务@PeterDuniho –

【问题讨论】:

  • 为什么不直接做await Task.WhenAll(_service1.Sendmessage(), _servic2.Sendmessage());
  • @juharr 我正在使用 whenAll 运行主 SendMessageAsync。我的问题是有没有办法在不同的线程中运行这些异步调用
  • 如果它们是 I/O 绑定的,那么这样做没有多大意义。
  • @YashwanthChowdaryKata juharr 已经回答了这个问题。任务不是线程,它们是承诺。您还没有解释这些方法的作用,但它们是三件事之一 - 仅返回已完成任务的假异步方法,已经执行的任务,在这种情况下,问题是没有实际意义的,或者已经等待完成的异步操作和完全不涉及线程
  • 如此处所述,您只需要await Task.WhenAll(...)。见重复。性能的讨论似乎与您提出的问题无关。您如何等待异步结果与如何产生异步结果无关。更改等待方式不会对性能产生任何影响。如果您需要性能方面的帮助,a) 做一些研究,然后如果您仍然需要帮助 b) 发布一个新问题,其中包含一个 minimal reproducible example 来证明您的问题,说明您尝试过的内容修复它,以及具体您需要什么帮助。

标签: c# multithreading async-await task-parallel-library backgroundworker


【解决方案1】:

为什么不使用await Task.WhenAll?设置两个单独的Tasks 运行,await 两者都运行。

public async Task SendMessageAsync()
{
   await Task.WhenAll(_service1.Sendmessage(), _servic2.Sendmessage());
}

对 WhenAll(IEnumerable) 方法的调用不会阻塞 调用线程。

(https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.whenall?view=netcore-3.1)

【讨论】:

  • 链接中的文档说“”创建一个在所有提供的任务都完成后完成的任务。“SendMessageAsync 已经在 whenall 中被调用。我的问题是有没有办法调用SendmessageToRestServiceAsync 独立于其他任务
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多