gpt4 book ai didi

c# - 没有 I/O 的异步/等待

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:59 24 4
gpt4 key购买 nike

我刚开始学习 async/await。

Stephen Cleary 有这篇文章: https://blog.stephencleary.com/2013/11/there-is-no-thread.html

我对 I/O 了解不多,但是...有人可以向我解释一下如何为不使用 I/O 的操作应用异步/等待逻辑吗?

假设我们有一个 string[] 并且想要反转这个数组中的所有字符串。

async Task<string> ReverseAsync(string s)
{
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}

然后我想为数组中的每个元素“并行”调用此方法。我知道这样的代码将无效,但如何使用 async/await 实现它?

最佳答案

Can someone explain me how can I apply the async/await logic for an operation that doesn't use I/O?

您可以在 .NET 中使用新的 async/await 来简化并发操作,而无需费力地处理可能昂贵的线程。 async/await 的使用与操作是 CPU 绑定(bind)还是 IO 绑定(bind)无关。

除了对于受 CPU 限制的操作,您通常显式调用 Task.Run() 或其版本外,语法基本相同。 TasK 可以被认为是表示并发操作的高级构造,不是 Thread 的同义词。 Task.Run 将在线程池中最有可能已经运行的可重用线程之一中执行代码。一旦您的操作完成,它就会返回到池中。

例如

await Task.Run (() => CalculatePrimeNumbersAsync (10000));

在您的场景中,您应该尝试调用 Task.Run() 尽可能靠近调用堆栈的顶部。这使您的代码:

  1. 更直观
  2. 很明显调用的操作是异步的
  3. 客户端代码可以完全控制根任务的创建
  4. 为客户端代码提供捕获当前上下文的机会(在 GUI 代码中特别有用)

Then I want to "parallelly" call this method for each element in the array. I understand that a code like this will not be a valid, but how can it be implemented using async/await?

您可能无法更改实现,但您肯定可以通过调用方法的方式利用并发。

所以给定你的代码:

async Task<string> ReverseAsync(string s)
{
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}

您可以这样调用它(假设它是 WinForms 中的按钮单击处理程序):

async void OnButtonClicked (object sender, System.EventArgs e)
{
var reversed = await Task.Run(() => ReverseString ("Miss Piggy is a Muppet"));
}

请再次注意我们使用 Task.Run() 因为客户端代码知道 ReverseString 是 CPU 绑定(bind)的。如果您要调用某些 I/O 绑定(bind)(例如 WCF 或 Entity Framework ),请不要使用 Task.Run()。

更多

关于c# - 没有 I/O 的异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46871492/

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