【异步编程】三种模式
.NET 提供了执⾏异步操作的三种模式:
基于任务的异步模式 (Task-based Asynchronous Pattern, TAP)
该模式使⽤单⼀⽅法表⽰异步操作的开始和完成。 TAP 是在 .NET Framework 4 中引⼊的。 这是在 .NET 中进⾏异步编程的推荐⽅法。 C# 中的 async 和 await 关键词为 TAP 添加了语⾔⽀持。
样例
// 定义⼀个异步执⾏的⽅法
private async void OnTaskAsync(object sender, System.EventArgs e)
{
// ⽤于任务的取消
System.Threading.CancellationTokenSource cts = new System.Threading.CancellationTokenSource();
var clientHandler = new System.Net.Http.HttpClientHandler();
var client = new System.Net.Http.HttpClient(clientHandler);
...
var response = await client.GetAsync(req.Url, _cts.Token);
response.EnsureSuccessStatusCode();
string resp = await response.Content.ReadAsStringAsync();
await System.Threading.Tasks.Task.Run(() =>
{
var images = req.Parse(resp);
foreach (var image in images)
{
cts.Token.ThrowIfCancellationRequested();
.
..
}
}, cts.Token);
}
基于事件的异步模式 (Event-based Asynchronous Pattern, EAP)
是提供异步⾏为的基于事件的旧模型。 这种模式需要后缀为 Async 的⽅法,以及⼀个或多个事件、事件处理程序委托类型
和 EventArg 派⽣类型。 EAP 是在 .NET Framework 2.0 中引⼊的。 建议新开发中不再使⽤这种模式。
样例
var client = new System.Net.WebClient();
client.DownloadStringCompleted += OnDownloadStringCompleted;
client.DownloadStringAsync(new System.Uri(...));
private void OnStringCompletedEventHandler(object sender, System.Net.DownloadStringCompletedEventArgs e)
{
await和async使用方法...
}
异步编程模型模式 (Asynchronous Programming Model, APM)
这是使⽤ IAsyncResult 接⼝提供异步⾏为的旧模型。 在这种模式下,同步操作需要 Begin 和 End ⽅法(例
如,BeginWrite 和 EndWrite以实现异步写⼊操作)。 不建议新的开发使⽤此模式。
样例
System.Action<> downloadString = () =>
{
var client = new System.Net.WebClient();
...
return client.DownloadString(address);
};
System.IAsyncResult ar = downloadString.BeginInvoke(null, null);
...
downloadString.EndInvoke(ar);
模式的⽐较
为了快速⽐较这三种模式的异步操作⽅式,请考虑使⽤从指定偏移量处起将指定量数据读取到提供的缓冲区中的Read⽅法:public class MyClass { public int Read(byte [] buffer, int offset, int count); }
此⽅法对应的 TAP 将公开以下单个 ReadAsync ⽅法:
public class MyClass { public Task<int> ReadAsync(byte [] buffer, int offset, int count); }
对应的 EAP 将公开以下类型和成员的集:
public class MyClass
{
public void ReadAsync(byte [] buffer, int offset, int count);
public event ReadCompletedEventHandler ReadCompleted;
}
对应的 APM 将公开 BeginRead 和 EndRead ⽅法:
public class MyClass
{
public IAsyncResult BeginRead(byte [] buffer, int offset, int count, AsyncCallback callback, object state);
public int EndRead(IAsyncResult asyncResult);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论