加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 异步方法和异步代理

发布时间:2020-12-15 06:18:15 所属栏目:百科 来源:网络整理
导读:简而言之,C#3.0表示异步方法和异步代理看起来类似,但是行为是非常不同的. 这本书是关于这两本书的. 异步方法 很少或永远不会阻止任何线程. Begin方法可能不会立即返回给调用者. 一个没有C#语言支持的协议协议. 异步代理 可能会阻止任何时间的长度 BeginInvok
简而言之,C#3.0表示异步方法和异步代理看起来类似,但是行为是非常不同的.

这本书是关于这两本书的.

异步方法

>很少或永远不会阻止任何线程.
> Begin方法可能不会立即返回给调用者.
>一个没有C#语言支持的协议协议.

异步代理

>可能会阻止任何时间的长度
> BeginInvoke立即返回给调用者.
>内置编译器支持.

这本书还说,异步方法的目的是允许许多任务在几个线程上运行;异步代理的目的是与调用者并行执行任务.

当我通过反射器查看System.IO.Stream类中的BeginRead()方法时,它正在使用一个委托并调用BeginInvoke.所以异步方法是在内部使用异步委托.

>在这种情况下,怎么说他们的行为是不同的?由于内部使用代表,如何进行比较?
>你认为使用代理的BeginXXX方法是和调用者并行执行一个函数的方式吗?
>通过保持所有优点,如充分利用CPU,实现异步方法的正确方法是什么?

有什么想法吗?

解决方法

在内核中,当您使用回调函数调用BeginFoo()时,可能会看到两种主要行为.

>工作是在后台线程上启动的,该线程将在整个时间内被使用,直到工作完成并且回调被调用(例如因为工作是同步的).
>尽管某些工作发生在后台线程上,线程不需要在整个时间内使用(例如,因为该工作涉及可以在IOCompletionPort上调度回调的系统IO).

当您使用委托时,上述行为#1发生.

一些API(具有非阻塞IO调用的基础支持)支持行为#2.

在“Stream”的具体情况下,我不确定,但是我猜测这是一个抽象的基类,所以这只是一个仅实现Read的同步版本的子类的默认行为. “好”子类将覆盖BeginRead / EndRead以具有非阻塞的实现.

正如你所说,#2的优点是,你可以有例如100个等待IO呼叫,而不消耗100个线程(线程昂贵).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读