首页 > 其他分享 >System.Threading.Tasks.Extensions介绍

System.Threading.Tasks.Extensions介绍

时间:2023-09-06 17:12:37浏览次数:34  
标签:异步 Tasks using 取消 System Threading Extensions 操作 WithCancellation

System.Threading.Tasks.Extensions 是一个用于扩展 .NET 中任务(Task)的库,它提供了一些额外的功能,特别是在异步编程方面。这个库引入了一些新的方法和功能,包括:

  1. ConfigureAwait:它引入了 ConfigureAwait 方法,允许你在任务之间配置不同的上下文(例如,同步上下文或异步上下文),以便更好地控制异步代码的执行上下文。
  2. IterateIterate 方法允许你在异步迭代中使用 await,从而使异步循环更加容易和直观。
  3. ValueTask:引入了 ValueTask<T> 结构,这是一种轻量级的值类型,用于表示一个可能是同步也可能是异步的操作的结果。这可以提高性能,减少异步操作的开销。
  4. AsyncIteratorAsyncIterator<T> 类型是一个可枚举异步序列的实现,它使你可以使用 await foreach 循环异步枚举序列。
  5. WithCancellationWithCancellation 方法允许你为任务添加取消令牌,以便在取消操作时终止任务。
  6. WaitAsyncWaitAsync 方法是 Task.WhenAny 的扩展方法,它使你可以等待多个任务中的任何一个完成,并返回完成的任务。

这些功能扩展了 .NET 中异步编程的能力,使开发人员能够更方便地编写高效的异步代码。如果你在使用异步任务时遇到特定的需求或问题,System.Threading.Tasks.Extensions 可能会提供一些有用的工具和方法。

WithCancellation 方法的主要用途是在异步任务中添加取消支持。这在以下情况下非常有用:

  1. 长时间运行的操作:当你有一个可能需要较长时间才能完成的异步操作时,你可以使用 WithCancellation 来允许用户或系统取消该操作,而不必等待其完成。
  2. 用户交互:在用户界面(如 WPF 或 WinForms)中,用户可能会要求取消某些操作。你可以使用 WithCancellation 来允许用户在操作进行时取消它们。
  3. 资源释放:在某些情况下,你可能需要确保异步操作在取消时释放相关资源。WithCancellation 可以帮助你在取消时执行清理工作。

当需要执行一个长时间运行的异步操作,并且希望支持取消操作,但同时也要执行一些不需要取消支持的子操作时,你可以使用 WithCancellation 来实现这一目标。以下是一个示例,结合了 WithCancellation 的使用,其中包含了长时间运行的文件下载操作:

using System;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var cts = new CancellationTokenSource();

        // 创建一个取消令牌,用于取消整个操作
        var cancellationToken = cts.Token;

        var downloadTask = DownloadFileAsync("https://example.com/somefile.txt", cancellationToken);

        // 等待用户输入以取消整个操作
        Console.WriteLine("Press Enter to cancel the operation...");
        Console.ReadLine();

        // 发出取消请求
        cts.Cancel();

        try
        {
            await downloadTask;
            Console.WriteLine("File downloaded successfully.");
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Operation was canceled.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }

    static async Task DownloadFileAsync(string url, CancellationToken cancellationToken)
    {
        using var httpClient = new HttpClient();

        // 使用WithCancellation包装异步操作,以便支持取消
        var response = await httpClient.GetAsync(url).WithCancellation(cancellationToken);

        if (response.IsSuccessStatusCode)
        {
            // 从响应中读取内容,并处理文件下载
            var contentStream = await response.Content.ReadAsStreamAsync();
            using var fileStream = File.Create("downloadedFile.txt");
            await contentStream.CopyToAsync(fileStream);
        }
        else
        {
            throw new InvalidOperationException($"Failed to download file. Status code: {response.StatusCode}");
        }
    }
}

在这个示例中,我们创建了一个 DownloadFileAsync 方法,该方法使用 WithCancellation 包装了 HttpClient 异步操作,以支持取消。同时,我们也创建了一个取消令牌 cancellationToken,以便在用户要求取消操作时终止整个操作。如果用户取消了操作,将捕获 OperationCanceledException,否则,我们会在文件下载完成时正常输出成功信息。这个示例结合了长时间运行的文件下载和取消操作的需求。

标签:异步,Tasks,using,取消,System,Threading,Extensions,操作,WithCancellation
From: https://www.cnblogs.com/linxmouse/p/17682844.html

相关文章

  • OPTIONS.info_dict的tool_extensions取值过程分析
    1 首先在build/core/envsetup.mk中有:board_config_mk:=\$(strip$(wildcard\$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk\......
  • Submit Tasks in Batch using ExecutorService
    SubmitTasksinBatchusingExecutorServicehttp://www.javabyexamples.com/submit-tasks-in-batch-using-executorservice1.OverviewInthistutorial,we'regoingtolookathowwecansubmittasksinbatchusingtheExecutorServiceimplementations.2.......
  • 这是一个基于threading可停止线程的有限容量有限并行度的python任务管理器
    这是一个可停止线程的有限容量有限并行度的任务管理器基于:GitHub-AlitaIcon/StopableThreadJob:可停止线程任务管理器QuickStart基础调用与效果importtimeimportdatetimefromloguruimportloggerfromStopableThreadJob.job_managerimportJobManagerif__name......
  • SCHTASKS 执行计划任务
    不正确:schtasks/create/tn"MySQLAutomaticBackup"/tr"d:\pathwithspacestomyscript\myscript.bat"/scdaily...  正确:schtasks/create/tn"MySQLAutomaticBackup"/tr"\"d:\pathwiths......
  • threading用法
    threading模块是Python的标准库之一,提供了多线程编程的支持。以下是threading模块的一些常用方法: 1.threading.Thread(target=function,args=(),kwargs={},name=None):创建一个新线程,并指定其执行的函数、参数和关键字参数。2.threading.active_count():返回当前活动的线程......
  • Java踩坑3.org.gradle.api.tasks.sourceset.getcompiloconfigurationname
    idea2018自带gradle版本4.1我改properties文件为7.5启动项目,sync时报错,如标题。解决步骤:1.我尝试更改jdk9和11都一样报错。2.我尝试改properties文件为6.4不报错。3.我仍然使用properties文件为7.5,不理会build窗口的这个错误。在右侧的gradle插件build,clean这些正常使用。......
  • C# Microsoft.Win32.TaskScheduler方式创建任务计划程序报错: System.ArgumentExceptio
    使用Microsoft.Win32.TaskScheduler创建任务计划程序可参考本人之前的一篇文章:https://www.cnblogs.com/log9527blog/p/17329755.html最新发现个别账户使用Microsoft.Win32.TaskScheduler创建任务计划程序报错:System.ArgumentException:(12,21):UserId:Account一种情况是账户......
  • .NET Core读取配置文件 配置文件可以是JSON、XML或INI等格式,需要添加 Microsoft.Exten
    .NETCore读取配置文件配置文件可以是JSON、XML或INI等格式需要添加Microsoft.Extensions.Configuration扩展包原文链接:https://pythonjishu.com/qipsfiygesyrqfi/下面是“.NETCore读取配置文件”的完整攻略:1.创建配置文件首先,我们需要在项目中创建一个配置文件,以便存......
  • Python中threading模块 lock、Rlock的使用
    一、概述在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock、Rlock、Semaphore、Event、Condition用来保证线程之间的同步,后者保证访问......
  • SAP UI5 manifest.json 里定义的 sap.ui.viewExtensions 区域的解析代码位置
    笔者这篇教程介绍了如何在SAPFioriElements应用的manifest.json里注册Extensionfragment,从而给ListReport应用的Table区域新增自定义列:10.如何通过扩展(Extension)的方式给SAPFioriElementsListReport的表格新增列上图extends区域注册的Extension信......