C# 异步

首先说几个关键词:

bash 复制代码
async:修饰方法,表明该方法是异步的
Task:异步任务,可以作为异步方法的返回值
await:等待异步方法执行完成,只能在异步方法中使用
TaskCompletionSource:可通过SetResult方法来设置异步的结果
csharp 复制代码
using System;
using System.Threading.Tasks;

class Program
{
    static async void AsyncMethod()
    {
        await Task.Run(() =>
        {
            Console.WriteLine("耗时操作");
        });
        await AsyncTaskCompletion();
    }

    static async Task<int> AsyncTaskCompletion()
    {
        Console.WriteLine("AsyncTaskCompletion Start");
        TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();

        // 模拟异步操作
        await Task.Delay(3000).ContinueWith(task =>
        {
            if (task.Exception != null)
            {
                tcs.SetException(task.Exception);
            }
            else
            {
                // 设置异步操作的结果
                tcs.SetResult(42);
            }
        });
        Console.WriteLine("AsyncTaskCompletion END");
        return await tcs.Task;
    }

    static void Main()
    {
        Console.WriteLine("Main Start");
        AsyncMethod(); 
        Console.WriteLine("Main END");
        Console.ReadLine();
    }
}

main方法中执行一个返回值为空的异步方法AsyncMethod,在AsyncMethod可以执行各种耗时操作而不影响main方法执行。

在AsyncTaskCompletion方法中等待tcs.SetResult方法执行后才会返回,可用于在回调函数中设置结果。

相关推荐
無限進步D3 小时前
Java 运行原理
java·开发语言·入门
是苏浙3 小时前
JDK17新增特性
java·开发语言
SPC的存折5 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
爱学习的小囧6 小时前
VMware ESXi 6.7U3v 新版特性、驱动集成教程和资源包、部署教程及高频问答详情
运维·服务器·虚拟化·esxi6.7·esxi蟹卡驱动
小疙瘩6 小时前
只是记录自己发布若依分离系统到linux过程中遇到的问题
linux·运维·服务器
dldw7776 小时前
IE无法正常登录windows2000server的FTP服务器
运维·服务器·网络
阿里加多6 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood7 小时前
java中`==`和`.equals()`区别
java·开发语言·python
我是伪码农7 小时前
外卖餐具智能推荐
linux·服务器·前端
zs宝来了7 小时前
AQS详解
java·开发语言·jvm