- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚开始学习 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() 尽可能靠近调用堆栈的顶部。这使您的代码:
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/
我是一名优秀的程序员,十分优秀!