如何在不同的线程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#中运行两种不同的异步方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Thrift 中使用不同的线程池处理请求?

C#异步编程----Thread

异常永远不会到达异步方法中的处理程序(C#)[重复]

如果我在不同的线程上同步运行,它是不是会使其总体异步?

c# - 如何强制关闭运行它自己的线程的后台工作者

异步代码是不是在 UI 线程或新/不同线程中运行以不阻塞 UI?