gpt4 book ai didi

c# - 如何实现 "true"异步

转载 作者:太空狗 更新时间:2023-10-30 00:04:49 25 4
gpt4 key购买 nike

在他对 this question 的回答中, Stephen Cleary指“假”异步和“真”异步。

there's a much easier way to schedule work to the thread pool: Task.Run.

True asynchrony isn't possible, because you have a blocking method that you must use. So, all you can do is a workaround - fake asynchrony, a.k.a. blocking a thread pool thread.

那么如何实现真正的异步,就像 System.Threading.Tasks.Task 中的各种方法一样?如果您深入挖掘,所有“真正的异步”方法不都是在阻塞其他线程上的操作吗?

最佳答案

Aren't all "truly asynchronous" methods just blocking operations on some other thread if you dig deep enough?

没有。真正的异步操作不需要贯穿整个操作的线程,使用一个线程会限制可扩展性并损害性能。

虽然大多数真正的异步操作是 I/O 操作,但它可能过于复杂而难以理解。 (要深入阅读 Stephen Cleary 的 There Is No Thread)。

例如,假设您想要等待 用户的按钮点击。由于有一个 Button.Click 事件,我们可以利用 TaskCompletionSource 异步等待引发该事件:

var tcs = new TaskCompletionSource<bool>();
_button.Click += (sender, EventArgs e) => tcs.SetResult(false);
await tcs.Task;

没有非通用的TaskCompletionSource,所以我使用了一个带有虚拟值的bool。这将创建一个未连接到线程的 Task,它只是一个同步结构,只有在用户单击该按钮(通过 SetResult)时才会完成。您可以await Task 很长时间而不会阻塞任何线程。

Task.Delay 的实现与 System.Threading.Timer 非常相似,后者在其回调中完成等待的任务。

关于c# - 如何实现 "true"异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237105/

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