如何在不同的线程c#中运行两种不同的异步方法[重复]
Posted
技术标签:
【中文标题】如何在不同的线程c#中运行两种不同的异步方法[重复]【英文标题】:how to run two different asynchronous methods in different threads c# [duplicate] 【发布时间】: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 来证明您的问题,说明您尝试过的内容修复它,以及具体您需要什么帮助。
【参考方案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 独立于其他任务以上是关于如何在不同的线程c#中运行两种不同的异步方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章