gpt4 book ai didi

c# - 我真的在这里使用任务和异步获得了任何东西吗?

转载 作者:行者123 更新时间:2023-12-02 14:52:53 26 4
gpt4 key购买 nike

我正在尝试掌握任务和 Async Await 关键字。我有一个小示例方法,它本质上调用 n 个方法。需要注意的两个要点是

  • 我不关心方法运行的顺序
  • 所有方法都应在后台线程上调用

这里是代码。

public async void Handle<T>(T entry) {
await Task.Run(() => {
Parallel.ForEach(_handlers, pair => {
pair.Value.Invoke(_reference, new object[] {
entry
});
});
});

我的问题是我实际上从上面的代码中获得了任何异步或并行性吗?

最佳答案

我假设您正在 UI 应用程序中运行,因为服务器上的并行代码非常罕见。

在本例中,将并行代码包装在 Task.Run 中这是完全正常的,并且是当您希望异步执行并行代码时的常见模式。

我会做一些改变:

  1. 避免 async void 。返回Task ,这样您就可以更干净地处理错误。
  2. 遵循基于任务的异步模式命名约定(即用 Async 结束你的方法)。
  3. 返回Task直接代替async/await (如果你的整个 async 方法只是针对 await 一个任务,那么你可以通过直接返回任务来避免一些开销)。

像这样:

public Task HandleAsync<T>(T entry) {
return Task.Run(() => {
Parallel.ForEach(_handlers, pair => {
pair.Value.Invoke(_reference, new object[] {
entry
});
});
});

我还会考虑其他两种可能性:

  1. 考虑使用Parallel.Invoke而不是Parallel.ForEach 。在我看来Parallel.Invoke与您实际想要做的事情更接近。(请参阅下面 svick 的评论)。
  2. 考虑将并行代码保留在同步方法中(例如 public void Handle<T>(T entry) )并使用 Task.Run 调用它。 (例如 await Task.Run(() => Handle(entry)); )。如果您Handle[Async]方法旨在成为通用库的一部分,那么您希望避免使用 Task.Run在您的异步方法中。

关于c# - 我真的在这里使用任务和异步获得了任何东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com