学懂C#编程:常用高级技术——学会C#多线程开发(二)之 处理异步Task应用

发布于:2024-07-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

在C#中,Task 是用于处理异步操作的一个强大的工具,它属于.NET Framework中的 System.Threading.Tasks 命名空间。Task 代表一个异步操作,它可以在单独的线程上执行,也可以在当前线程上执行(如果不需要额外的线程)。Task 提供了一种比传统的线程和线程池更高级、更灵活的并发编程模型。

以下是一些关于 Task 的基本概念和用法:

创建和启动 Task

你可以使用 Task.Run 方法来创建并启动一个新的 Task。这个方法接受一个 ActionFunc 委托,表示要异步执行的代码块。

Task task = Task.Run(() =>
{
    // 异步执行的代码
    Console.WriteLine("Task is running...");
});

等待 Task 完成

如果你需要等待 Task 完成,可以使用 Task.Wait 方法或者在 await 关键字后面使用 Task

// 使用 Wait 方法
task.Wait(); // 阻塞当前线程,直到 Task 完成

// 使用 await(需要在一个异步方法中)
async Task SomeMethod()
{
    await task; // 非阻塞,允许方法的其余部分在 Task 完成前继续执行
}

处理 Task 的结果

如果 Task 执行的是一个返回值的操作(即 Func<TResult>),你可以通过 Task<TResult>.Result 属性来获取结果。

Task<int> taskWithResult = Task.Run(() =>
{
    return 42; // 返回一个整数
});

int result = taskWithResult.Result; // 获取结果

异常处理

Task 可以抛出异常,这些异常会被封装在 AggregateException 中。你可以通过 Task.Exception 属性来访问这些异常。

try
{
    Task taskWithException = Task.Run(() =>
    {
        throw new Exception("Something went wrong");
    });

    taskWithException.Wait(); // 等待 Task 完成,以便捕获异常
}
catch (AggregateException ex)
{
    // 处理异常
    Console.WriteLine(ex.InnerExceptions[0].Message);
}

取消 Task

你可以使用 CancellationToken 来取消一个 Task。这通常涉及到创建一个 CancellationTokenSource,然后将其 Token 传递给 Task

CancellationTokenSource cts = new CancellationTokenSource();
Task task = Task.Run(() =>
{
    for (int i = 0; i < 1000; i++)
    {
        if (cts.Token.IsCancellationRequested)
        {
            Console.WriteLine("Task cancelled");
            return;
        }
        Console.WriteLine(i);
    }
}, cts.Token);

// 稍后取消 Task
cts.Cancel();

组合 Task

Task 提供了多种方法来组合多个 Task,例如 Task.WhenAllTask.WhenAny

Task task1 = Task.Run(() => Console.WriteLine("Task 1"));
Task task2 = Task.Run(() => Console.WriteLine("Task 2"));

// 等待所有 Task 完成
await Task.WhenAll(task1, task2);

// 等待任意一个 Task 完成
Task anyTask = await Task.WhenAny(task1, task2);

学习 Task 是掌握C#异步编程的关键部分,它可以帮助你编写更高效、响应性更好的应用程序。随着你对 Task 的理解加深,你可以探索更高级的异步模式,如 asyncawait,以及 Task 的更多高级用法。


网站公告

今日签到

点亮在社区的每一天
去签到