惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 数字冰块

VS2005 中文版的翻译 - 数字冰块 - 博客园 关于使用 EnumWindows 枚举应用程序窗口的技巧 Requirements Analysis with 'pseud-Formal' Method 微软亚洲研究院夏令营记 软件学院学习体验之三 关于权限模型 .netcpu?!见过了吗? 着手准备开源桌面 Blog 软件 一定要记住:Page.IsPostBack 不能忘。。。 软件学院学习体验之二 VS.NET 服务器资源管理器、Smartphone 模拟器中的程序调试、虚拟网卡、Smartphone 设备上的程序调试及其他。 软件学院学习体验之一 啥叫“Functional Programming ”??? 一个奇怪的问题 什么是高质量的代码? C#中的析构函数 毕业了。。。 两年以后重读了一篇文章,写了点东西。 微软的宣传图片
关于.NET异步调用的初步总结
数字冰块 · 2004-07-02 · via 博客园 - 数字冰块

最近看了看.NET异步调用方面的资料,现择重点总结,若有纰漏敬请指正。

异步调用的实质:
异步调用通过委托将所需调用的方法置于一个新线程上运行,从而能够使一个可能需要较长时间的任务在后台执行而不影响调用方的其他行为。

异步调用的实现:
前面已经讲道,异步调用通过委托实现。委托支持同步和异步调用。在同步调用中,一个委托的实例可记录多个目标方法;在异步调用中,一个委托实例中有且只能包含一个目标方法。异步调用使用委托实例的BeginInvoke方法和EndInvoke方法分别开始调用和检索返回值,这两个方法在编译期生成。调用BeginInvoke后委托立即返回;调用EndInvoke时倘若委托方法未执行完毕,则阻塞当前线程至调用完毕。
假设有一个委托

public delegate int ASyncHandler(int a,string b,ref string c);

那么,其BeginInvoke与EndInvoke的形式如下:

也就是说,BeginInvoke与EndInvoke的参数列表与当前委托签名有关,可以总结为:

public IAsyncResult BeginInvoke(,AsyncCallback callback,object asyncState);

public  EndInvoke(,IAsyncResult asyncResult);

BeginInvoke返回一个IAsyncResult,其实质是实现IAsyncResult的System.Runtime.Remoting.Messaging.AsyncResult类。该对象相当于一个“凭证”,在调用EndInvoke时用于确认应等待返回的方法(猜测如此)。就像去银行,存钱时拿到一份存折(凭证),取款时依据存折(凭证)取款。
EndInvoke检索委托返回值,并返回标有ref/out的参数值。
IAsyncResult接口声明:

public interface IAsyncResult
{
    
object AsyncState{get;}
    WaitHandle AsyncWaitHandle
{get;}
    
bool CompletedSynchronously{get;}
    
bool IsCompleted{get;}
}

等待调用结束的三种方法:
1、使用EndInvoke主动等待异步调用结束。这是最简单的一种方法,适用于非用户界面程序及一些IO操作,因为在调用EndInvoke之后当前线程被阻塞,除了等待什么都不能做。
2、使用WaitHandle等待异步调用结束。IAsyncResult中有WaitHandle成员,获取用于等待异步操作完成的WaitHandle,即调用结束信号。使用WaitHandle.WaitOne()可以阻塞当前线程至异步调用完成。这样做的好处是:在调用WaitOne之后、EndInvoke之前,可以执行其他处理。
3、主动轮询。使用IAsyncResult中有IsCompleted成员检索当前异步调用情况。该方法适用于用户界面程序,想象可在一个循环内做到既等待委托完成,又可以更新用户界面。
4、使用回调,在异步调用结束时执行一个操作。前面的BeginInvoke方法签名的最后两个参数用于回调。需要用到AsyncCallback委托:

public delegate void AsyncCallback(IAsyncResult asyncResult);

回调方法在系统线程池中执行。BeginInvoke的最后一个参数(object asyncState)可以传递包含回调方法将要使用的信息的对象。在回调方法中调用EndInvoke可以通过取得System.Runtime.Remoting.Messaging.AsyncResult.AsyncDelegate实现。

个人认为方法1、2相差不算太大。

先写这么些,以后再补上其他的一些东西。