绝望的C#:Task是个良好的设计吗?

专栏介绍与文章目录-CSDN博客

        我对高级语言的异步机制总感到理解起来比较困难。明确的创建任务、等待任务不好吗?

        执行异步调用的方法返回一个Task是很正常的,很容易理解,但是Task.Result为什么导致阻塞呢?

        一个属性,而不是一个方法,竟然导致了阻塞,你们高级语言的思路真是很高级啊。

        好吧,这只是个吐槽。

        下面这个图来自微软learn网站,用来介绍异步方法的运行机制,非常大厂风啊:

        屁大点事画个图眼花缭乱。其实里面只有两个关键点:

  1. client.GetStringAsync发起一个异步任务,一般我们(C/C++派)就称之为“CreateTask...”或者“StartTask...”,这一步不会阻塞。
  2. await getStringTask等待异步任务结束,一般我们就是用个“Wait...”,这一步会阻塞,等待任务结束以便获得结果。

        为了在层层调用中发现是否存在等待而引入新的关键字是可以理解的,毕竟这样做有很大的好处(不然从层层调用里发现哪里阻塞是很头疼的)。

        但是Task的设计是很怪的。Task本身没什么不可理解的,但是Task.Result为什么会阻塞?这只是一个属性啊!检查任务结果和等待任务返回根本就是两个完全不相干的事情,怎么能混在一起呢?仅仅因为语法上支持?

(这里是结束)

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`std::task::Context` 是 Rust 标准库中的一个结构体,它用于在异步任务执行时传递上下文信息。通常情况下,你不需要手动创建 `Context` 对象,而是通过异步框架提供的方法将其传递给异步任务。 在异步任务内部,你可以通过 `Context` 对象访问一些有用的信息。例如,你可以使用 `Context::waker()` 方法获取一个 `Waker` 对象,通过该对象可以唤醒当前任务。另外,你还可以使用 `Context::deadline()` 方法获取任务的截止时间。 以下是一个简单的示例,展示了如何在异步任务中使用 `Context`: ```rust use futures::Future; use std::task::{Context, Poll}; async fn my_task() { // 获取当前任务的上下文信息 let mut cx = Context::from_waker(futures::task::noop_waker_ref()); // 在任务未完成时循环执行 loop { // 模拟一些耗时操作 std::thread::sleep(std::time::Duration::from_secs(1)); // 检查任务是否已经被取消 if cx.waker().will_wake(&futures::task::noop_waker()) { // 如果任务已经被取消,停止执行 break; } // 检查任务是否已经到达截止时间 if let Some(deadline) = cx.deadline() { if deadline <= std::time::Instant::now() { // 如果已经到达截止时间,停止执行 break; } } // 在这里编写任务的实际逻辑 } } fn main() { // 创建一个异步任务 let my_task = my_task(); // 等待任务完成 futures::executor::block_on(my_task); } ``` 在上面的例子中,我们创建了一个异步任务 `my_task`,使用 `block_on` 函数来等待任务的完成。在任务内部,我们通过 `Context` 获取了当前任务的上下文信息,并在循环中模拟了一些操作。在每次循环开始时,我们都会检查一下任务是否已经被取消或者已经到达截止时间,如果是,就停止执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值