windows C#-生成和使用异步流(上)

异步流建立流式处理数据源模型。 数据流经常异步检索或生成元素。 它们为异步流式处理数据源提供了自然编程模型。

先决条件

需要将计算机设置为运行 .NET,包括 C# 编译器。 C# 编译器随附于 Visual Studio 2022 或 .NET SDK。

将需要创建 GitHub 访问令牌,以便可以访问 GitHub GraphQL 终结点。 为 GitHub 访问令牌选择以下权限:

  • repo:status
  • public_repo

将访问令牌保存在安全位置,以便可以使用它来访问 GitHub API 终结点。保护个人访问令牌。 任何带有你的个人访问令牌的软件都可以使用你的访问权限进行 GitHub API 调用。

运行初学者应用程序

可以从 asynchronous-programming/snippets 文件夹中的 dotnet/docs 存储库中获取本文中使用的初学者应用程序的代码。

初学者应用程序是一个控制台应用程序,它使用 GitHub GraphQL 接口检索最近在 dotnet/docs 存储库中编写的问题。 首先来看一下以下初学者应用 Main 方法的代码:

static async Task Main(string[] args)
{//Follow these steps to create a GitHub Access Token// https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token//Select the following permissions for your GitHub Access Token:// - repo:status// - public_repo// Replace the 3rd parameter to the following code with your GitHub access token.var key = GetEnvVariable("GitHubKey","You must store your GitHub key in the 'GitHubKey' environment variable","");var client = new GitHubClient(new Octokit.ProductHeaderValue("IssueQueryDemo")){Credentials = new Octokit.Credentials(key)};var progressReporter = new progressStatus((num) =>{Console.WriteLine($"Received {num} issues in total");});CancellationTokenSource cancellationSource = new CancellationTokenSource();try{var results = await RunPagedQueryAsync(client, PagedIssueQuery, "docs",cancellationSource.Token, progressReporter);foreach(var issue in results)Console.WriteLine(issue);}catch (OperationCanceledException){Console.WriteLine("Work has been cancelled");}
}

可以将 GitHubKey 环境变量设置为个人访问令牌,也可以将对 GetEnvVariable 的调用中的最后一个参数替换为个人访问令牌。 如果要与其他人共享源,请不要将访问代码放在源代码中。 不要将访问代码上传到共享源存储库。

在创建 GitHub 客户端后,Main 中的代码将创建一个进度报告对象和一个取消令牌。 创建这些对象之后,Main 调用 RunPagedQueryAsync 来检索最近创建的 250 个问题。 任务完成后,将显示结果。

在运行初学者应用程序时,可以对该应用程序的运行方式进行一些重要观察。 将看到从 GitHub 返回的每个页面的进度报告。 在 GitHub 返回问题的每个新页面之前,可以观察到明显的停顿。 最后,只有在从 GitHub 检索到所有 10 个页面之后,问题才会显示出来。

检查实现情况 

该实现揭示了你观察到上一部分中讨论的行为的原因。 检查 RunPagedQueryAsync 的代码:

private static async Task<JArray> RunPagedQueryAsync(GitHubClient client, string queryText, string repoName, CancellationToken cancel, IProgress<int> progress)
{var issueAndPRQuery = new GraphQLRequest{Query = queryText};issueAndPRQuery.Variables["repo_name"] = repoName;JArray finalResults = new JArray();bool hasMorePages = true;int pagesReturned = 0;int issuesReturned = 0;// Stop with 10 pages, because these are large repos:while (hasMorePages && (pagesReturned++ < 10)){var postBody = issueAndPRQuery.ToJsonText();var response = await client.Connection.Post<string>(new Uri("https://api.github.com/graphql"),postBody, "application/json", "application/json");JObject results = JObject.Parse(response.HttpResponse.Body.ToString()!);int totalCount = (int)issues(results)["totalCount"]!;hasMorePages = (bool)pageInfo(results)["hasPreviousPage"]!;issueAndPRQuery.Variables["start_cursor"] = pageInfo(results)["startCursor"]!.ToString();issuesReturned += issues(results)["nodes"]!.Count();finalResults.Merge(issues(results)["nodes"]!);progress?.Report(issuesReturned);cancel.ThrowIfCancellationRequested();}return finalResults;JObject issues(JObject result) => (JObject)result["data"]!["repository"]!["issues"]!;JObject pageInfo(JObject result) => (JObject)issues(result)["pageInfo"]!;
}

此方法执行的第一个操作是使用 GraphQLRequest 类创建 POST 对象:

public class GraphQLRequest
{[JsonProperty("query")]public string? Query { get; set; }[JsonProperty("variables")]public IDictionary<string, object> Variables { get; } = new Dictionary<string, object>();public string ToJsonText() =>JsonConvert.SerializeObject(this);
}

这有助于构成 POST 对象正文,并使用 ToJsonText 方法将其正确转换为以单个字符串呈现的 JSON,该方法从请求正文中删除所有换行符,并用 \(反斜杠)转义字符对其进行标记。

让我们集中讨论前面代码的分页算法和异步结构。 (有关 GitHub GraphQL API 的详细信息,可以参考 GitHub GraphQL 文档。)RunPagedQueryAsync 方法按从最新到最旧的顺序枚举问题。 它每页请求 25 个问题,并检查响应的 pageInfo 结构以继续上一页的操作。 这遵循了 GraphQL 对多页响应的标准分页支持。 响应包括 pageInfo 对象,该对象包含用于请求上一页的 hasPreviousPages 值和 startCursor 值。 问题在 nodes 数组中。 RunPagedQueryAsync 方法将这些节点追加到一个数组中,其中包含所有页面的所有结果。

在检索和还原结果页之后,RunPagedQueryAsync 将报告进度并检查是否取消。 如果已请求取消,RunPagedQueryAsync 将引发 OperationCanceledException。

此代码中有几个可以改进的元素。 最重要的是,RunPagedQueryAsync 必须为返回的所有问题分配存储空间。 该示例在 250 个问题处停止,因为检索所有未决问题需要更多的内存来存储所有检索到的问题。 支持进度报告和取消的协议使得算法在第一次读取时更加难以理解。 涉及更多类型和 API。 必须通过 CancellationTokenSource 及其关联的 CancellationToken 跟踪通信,以了解在何处请求取消,以及在何处授予取消。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477782.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vulhub靶场与pikachu靶场

一、搭建vulhub 环境&#xff1a;kaildocker 1.1 提权&#xff1a; :::color4 sudo su #权限升级为root ::: 1.2更新软件&#xff1a; :::color4 apt-get update ::: (此处我已更新过) 1.3安装HTTPS协议和CA证书&#xff1a; :::color4 apt-get install -y apt-transpo…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期&#xff1a;20241124 学习目标&#xff1a;http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记&#xff1a; 安装requests 安装方式&#xff1a;pip/pip3 install requests 官网教程&#xff1a;Requests: HTTP fo…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络&#xff0c;想使用wireshark抓包工具抓取Android手机网络日志&#xff0c;有以下两种连接方法&#xff1a; Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑&#xff0c;并在开发者模式中启用 USB 网络共享。 查看设备连接信…

Docker安装ubuntu1604

首先pull镜像 sudo docker run -d -P m.daocloud.io/docker.io/library/ubuntu:16.04国内使用小技巧&#xff1a; https://github.com/DaoCloud/public-image-mirror pull完成之后查看 sudo docker images 运行docker sudo docker run -d -v /mnt/e:/mnt/e m.daocloud.io/…

【数据结构与算法】树和二叉树

【数据结构与算法】树和二叉树 文章目录 【数据结构与算法】树和二叉树前言一、树的基本概念二、二叉树的基本概念三、二叉树的递归遍历四、二叉树的编程五、二叉树的非递归遍历总结 前言 本篇文章将讲到树的基本概念&#xff0c;二叉树的基本概念&#xff0c;二叉树的递归遍历…

大语言模型---Llama7B和Llama8B的区别;模型参数量;权重文件的不同;嵌入层权重的不同;输入序列长度的不同;应用场景

文章目录 1.概要2. 模型参数量3. 权重文件的不同4. 嵌入层权重的不同5. 输入序列长度的不同6. 应用场景 1.概要 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是由Meta开发的一系列语言模型&#xff0c;其中不同版本的参数量&#xff08;如7B、8B等&#xff09;…

Android Binder技术概览

Android中的Binder是一种基于远程过程调用&#xff08;Remote Procedure Call, RPC&#xff09;的轻量级通信机制&#xff0c;核心用于 Android 系统中的进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;。Binder 是 Android 系统中不可或缺的一部分&#…

NoteExpress导入知网论文无法智能更新题录的处理方法

知网论文下载下来一般为“标题_作者.caj”&#xff0c;只要在导入文件时对字段默认值进行设置就行了。 其他地方下载的论文也是一样&#xff0c;根据文件名称设置字段默认值。

搜索二维矩阵

搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c…

Mysql中的 TEXT 和 BLOB 解析

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

2024强网拟态决赛-eBeepf

漏洞分析与利用 分析后面看情况吧&#xff0c;有时间再写吧&#xff0c;先贴个利用脚本&#xff1a; #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <…

Duolingo「多邻国」v6.9.0 解锁Max高级版

前言 Duolingo是一个特别有名的学语言的应用软件&#xff0c;你可以用它来学西班牙语、法语、德语、意大利语、俄语等等好多种语言。当然&#xff0c;用它来学英语也是个不错的选择。 安装环境 [名称]&#xff1a;Duolingo「多邻国」 [大小]&#xff1a;79MB [版本]&#x…

鸿蒙开发-音视频

Media Kit 特点 一般场合的音视频处理&#xff0c;可以直接使用系统集成的Video组件&#xff0c;不过外观和功能自定义程度低Media kit&#xff1a;轻量媒体引擎&#xff0c;系统资源占用低支持音视频播放/录制&#xff0c;pipeline灵活拼装&#xff0c;插件化扩展source/demu…

基于SSM的婚庆管理系统+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、商家&#xff08;婚庆公司&#xff09;、用户功能模块&#xff1a;管理员&#xff08;用户管理、商家管理、摄影风格管理、礼服款式管理、案例管理、婚车品牌管理、婚纱拍摄管理、策划服务管理、婚宴酒店管理、婚车套餐管理、在线咨询…

manin动画编程(安装+入门)

文章目录 1.基本介绍2.效果展示3.安装步骤3.1安装manba软件3.2配置环境变量3.3查看是否成功3.4什么是mamba3.5创建虚拟环境3.6尝试进入虚拟环境 4.vscode操作4.1默认配置文件 5.安装ffmpeg6.安装manim软件6.vscode制作7.我的学习收获 1.基本介绍 这个manim就是一款软件&#x…

CH595 驱动数码管

先上原理图 我手里的是型号SR410361K的 4段数码管是共阳的&#xff08;低电平驱动&#xff09;&#xff0c;先发送数据&#xff0c;然后发送片选 共阴 共阳的图如下&#xff1a; 如何测量呢&#xff1f; 首先将数字万用表档位调节到蜂鸣器/二极管档&#xff0c;红表笔和黑表笔…

Vue生命周期详解

目录 1.beforeCreate2.created3.beforeMount4.mounted5.beforeUpdate6.updated7.beforeUnmount&#xff08;beforeDestroy&#xff09;8.unmounted&#xff08;destroyed&#xff09; 1.beforeCreate 分析 beforeCreate执行时Vue实例还没有被创建&#xff0c;data和methods也…

MySQL底层概述—1.InnoDB内存结构

大纲 1.InnoDB引擎架构 2.Buffer Pool 3.Page管理机制之Page页分类 4.Page管理机制之Page页管理 5.Change Buffer 6.Log Buffer 1.InnoDB引擎架构 (1)InnoDB引擎架构图 (2)InnoDB内存结构 (1)InnoDB引擎架构图 下面是InnoDB引擎架构图&#xff0c;主要分为内存结构和磁…

【力扣算法题】双指针-战场上的矛与盾的组合(移动零)(快乐数)

前言 &#x1f31f;&#x1f31f;本期讲解关于力扣算法两道双指针题目解析~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么…