gpt4 book ai didi

c# - 异步委托(delegate)操作说明?

转载 作者:行者123 更新时间:2023-11-30 22:19:49 25 4
gpt4 key购买 nike

我正在阅读 this question并由汉斯回答,但我仍然需要澄清。

据我所知,

The purpose of asynchronous methods is to allow many tasks to run on few threads; while the purpose of asynchronous delegates is to execute a task in parallel with the caller.

但是关于这两个异步操作:

如果 BeginInvoke 返回立即给调用者(它使用异步委托(delegate)),那么必须有其他线程实际做作业并在完成时发出信号。

那么使用 that 线程和常规线程池线程有什么区别呢?我回答:只有那些线程池线程已经存在并等待运行的事实?

但是当 BeginInvoke 运行并立即返回时,实际上有人 else 做了肮脏的工作(并且代码必须在线程下运行,该线程是正在处理中。)所以一定有某处线程的创建(在 beginXXX 调用之后运行)

我错过了什么?

最佳答案

Delegate.BeginInvoke 使用线程池线程,就像 QueueUserWorkItem 一样。不同之处在于它实现了 APM 模式,允许调用者使用 WaitHandle 等待调用完成,并提供回调。

Begin/End 方法对(又名异步编程模型)可以在很多地方找到,完全由实现者决定调用“开始”时会发生什么。在很多情况下,会使用一个IO完成端口,这是一种非常高效的等待IO完成的方式。当 IO 完成时,一个线程池线程用于执行回调,但它取自线程池的不同部分(这就是为什么 Set{Min,Max}Threads 有两个数字。)

附带说明一下,在 .NET 4.5(甚至 4.0)中,使用任务实现异步要容易得多。许多类都增加了诸如“XXXTaskAsyc”之类的方法,这些方法返回一个 Task 对象。

关于c# - 异步委托(delegate)操作说明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15356074/

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