当前位置: 首页 > 编程语言 > C#

异步方法和异步委托分享

时间:2023-04-10 20:07:48 C#

异步方法和异步委托简而言之,C#3.0说异步方法和异步委托看起来很相似,但行为却大不相同。这就是这本书所说的两者。异步方法很少或从不阻塞任何线程。Begin方法可能不会立即返回给调用者。没有C#语言支持的商定协议。异步代理可以阻塞任何时间长度,并且BeginInvoke会立即返回给调用者。内置编译器支持。该书还说,异步方法的目的是让许多任务在少数线程上运行;异步委托的目的是与调用者并行执行任务。当我通过反射查看System.IO.Stream类中的BeginRead()方法时,它正在使用委托并对其调用BeginInvoke。所以异步方法在内部使用异步委托。在这种情况下,怎么能说他们表现不同呢?由于它在内部使用委托,所以上面的比较是如何工作的?您认为使用委托的BeginXXX方法是与调用者并行执行函数的方式吗?通过保留充分利用CPU等的所有好处来实现异步方法的正确方法是什么?有任何想法吗?在核心,当您使用回调调用BeginFoo()时,您可能会看到两个主要行为。工作在后台线程上开始,该线程一直使用到工作完成并调用回调(例如,因为工作是同步的)。虽然一些工作发生在后台线程上,但不需要一直使用该线程(例如,因为工作涉及系统IO,它可以在IOCompletionPort上调度回调)。当您使用委托时,会发生上面的行为#1。某些API(具有对非阻塞IO调用的底层支持)支持行为#2。在“Stream”的具体情况下,我不确定,但我的猜测是它是一个抽象基类,所以这只是只实现Read同步版本的子类的默认行为。“好”子类将覆盖BeginRead/EndRead以具有非阻塞实现。正如您所说,#2的优点是您可以在不消耗100个线程的情况下进行100个挂起的IO调用(线程很昂贵)。实施可能会有所不同;例如,异步IO调用可能会选择使用完成端口来通过什么都不做来最小化系统成本。这当然是一种方式;您还可以在.NET4.0中使用BackgroundWorker、ThreadPool.QueueUserWorkItem或Parallel.For(等),每个实现都不同我猜这本书试图强调的是委托始终包含这种模式:但它不是唯一的模式。还;最近(例如,Silverlight或WebClient的异步IO方法):代替IAsyncResult,使用事件来表示完成。以上就是C#学习教程的全部内容:异步方法和异步委托。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: