本文还处于草稿阶段, 难免还有错误修改改正, 逻辑还不是很清晰, 笔者会努力完善, 长期更新!
[0000] 前言
标题起得有些 "大", 意在集大家的力量, 总结出来一份关于 Task 相对 "正确" 的知识总结, 欢迎读者提出宝贵意见! 本文内容来自于笔者在编码的时候种种疑问, 来自于对异步编程在操作系统中实际运行过程的好奇. 平时使用 Task 战战兢兢, 既想提高效率, 又怕它不受控制, 到处乱来. 与其这样, 不如此时此刻一起来了解它神秘的面纱吧! Just do IT.
[0001] 为什么要编写异步代码
新型应用广泛使用文件和网络 I/O. 默认情况下 I/O API 一般会阻塞, 导致糟糕的用户体验和硬件利用率, 除非希望学习和使用富有挑战的模式. 基于任务的异步 API 和语言级异步编程模型改变了这种模型, 只需了解几个新概念就可默认进行异步执行.
异步代码具有以下特点:
等待 I/O 请求返回的同时, 可通过生成处理更多请求的线程, 处理更多的服务器请求.
等待 I/O 请求的同时生成 UI 交互线程, 并通过将长时间运行的工作转换到其他 CPU 核心, 让 UI 的响应速度更快.
许多较新的 .NET APIs 都是异步的.
在 .NET 中编写异步代码很简单!
- public class MyClass
- {
- public int Read(byte [] buffer, int offset, int count);
- }
- public class MyClass
- {
- public Task<int> ReadAsync(byte [] buffer, int offset, int count);
- }
- public class MyClass
- {
- public void ReadAsync(byte [] buffer, int offset, int count);
- public event ReadCompletedEventHandler ReadCompleted;
- }
- public class MyClass
- {
- public IAsyncResult BeginRead(
- byte [] buffer, int offset, int count,
- AsyncCallback callback, object state);
- public int EndRead(IAsyncResult asyncResult);
- }
- public Task RunActionAsync(Action action)
- {
- TaskCompletionSource<Task> source = new TaskCompletionSource<Task>(TaskCreationOptions.AttachedToParent);
- Task<Task> task = source.Task;
- try
- {
- action.Invoke();
- }
- catch (Exception ex)
- {
- source.SetException(ex);
- }
- source.SetResult(Task.CompletedTask);
- return task;
- }
- Task.Factory.StartNew(_ =>
- {
- action.Invoke();
- },
- null,
- CancellationToken.None,
- TaskCreationOptions.LongRunning,
- TaskScheduler.Default)
- Task.Factory.FromAsync(
- new Func<AsyncCallback, object, IAsyncResult>((cb, obj) => action.BeginInvoke(biz, cb, obj)),
- new Action<IAsyncResult>(ar => action.EndInvoke(ar)), null)
- Asynchronous I/O in C#: I/O Completion Ports
- Asynchronous I/O in C#: I/O Completion Ports https://github.com/dschenkelman/async-io-talk
- Migrating Delegate.BeginInvoke Calls for .NET Core
来源: https://www.cnblogs.com/chasingdreams2017/p/11617985.html