0

0

c# gRPC Deadline 和 CancellationToken 的关系

煙雲

煙雲

发布时间:2026-02-05 09:52:04

|

790人浏览过

|

来源于php中文网

原创

Deadline 是客户端设定的 UTC 绝对截止时间,CancellationToken 是服务端据此自动生成的只读取消信号;二者角色分离、协同工作,缺一不可。

c# grpc deadline 和 cancellationtoken 的关系

Deadline 和 CancellationToken 不是同一个东西,但它们在 gRPC 调用中紧密协作——Deadline 是客户端设定的“绝对截止时刻”,CancellationToken 是服务端用来响应这个时刻的“取消信号载体”。

Deadline 是什么?为什么必须显式设置

gRPC 的 CallOptions.Deadline 是一个 DateTime 类型的 UTC 时间点(不是 TimeSpan),它随请求一起发给服务端。客户端和服务端各自独立检查是否超时:客户端在到达该时间点后立即中断 HTTP/2 流并抛出 RpcExceptionStatusCode.DeadlineExceeded);服务端则通过 ServerCallContext.CancellationToken 感知取消信号。

  • 没有默认值:不设 deadline 就等于无限等待,极易拖垮服务资源
  • 过去或当前时间会立刻触发超时:比如 DateTime.UtcNowDateTime.Now(非 UTC)都不可靠
  • 服务端无法“修改” Deadline:它只是接收并响应,不能延长或重置

CancellationToken 怎么从 Deadline 生成出来

服务端的 ServerCallContext.CancellationToken 并非手动创建,而是由 gRPC 框架根据客户端传来的 Deadline 自动绑定生成的。你不需要、也不应该用 CancellationTokenSource 手动创建它来覆盖这个 token。

沙之丘企业网站程序3.5
沙之丘企业网站程序3.5

沙之丘企业网站程序是一个以asp.net(C#) 4.0 +access进行开发的企业网站源码。主要功能:1、产品、设备、新闻系统2、留言信息直接发邮件到相关部门3、所有链接都以一级目录显示更好的权重4、其他信息扩展,可以增加如:人事招聘,公司介绍,地图,联系我们等5、带有商品和设备的搜索功能6、模板动态化方便扩展模板7、简体繁体选择显示运行环境:windows 2003或者更高windows服务

下载
  • 它本质是“只读”的取消信号源,背后关联着 Deadline 倒计时器
  • 你在服务方法中直接使用 context.CancellationToken 即可,例如传给 DbContext.FindAsync(..., ct)HttpClient.GetAsync(..., ct) 等异步 API
  • 如果忽略它(比如写 await _db.Users.ToListAsync() 而不传 token),即使 Deadline 已到,数据库查询仍会继续跑完,造成资源浪费

常见错误:混用 CancellationTokenSource 和 Deadline

有人试图在客户端用 CancellationTokenSource 控制调用,再额外加 deadline,结果行为不可预测——因为两者触发逻辑不同,且可能互相干扰。

  • 客户端主动取消(cts.Cancel())会提前终止调用,但不会影响服务端的 Deadline 计时
  • Deadline 超时会触发服务端的 context.CancellationToken,但不会触发你自建的 CancellationTokenSource
  • 推荐做法:客户端只用 deadline;服务端只用 context.CancellationToken;避免自己 new CancellationTokenSource 去包装或桥接
var client = new Greeter.GreeterClient(channel);
try
{
    var response = await client.SayHelloAsync(
        new HelloRequest { Name = "World" },
        deadline: DateTime.UtcNow.AddSeconds(5)); // ✅ 正确:只设 deadline
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.DeadlineExceeded)
{
    Console.WriteLine("Greeting timeout.");
}

// 服务端实现
public override async Task SayHello(HelloRequest request, ServerCallContext context)
{
    // ✅ 正确:直接用 context.CancellationToken
    var user = await _databaseContext.Users.FindAsync(request.Name, context.CancellationToken);
    return new HelloReply { Message = "Hello " + user?.Name };
}

最常被忽略的一点是:Deadline 是跨网络传递的语义,而 CancellationToken 是服务端内部响应这个语义的机制——它们是一体两面,但角色严格分离。写错任意一端,就等于让超时控制形同虚设。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6297

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

827

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1076

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1463

2024.03.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

362

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2087

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

351

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

256

2023.09.05

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号