百科问答小站 logo
百科问答小站 font logo



C#异步方法返回Task的意义是什么?完整的TAP代码是什么结构? 第1页

  

user avatar   Ivony 网友的相关建议: 
      

用await不就好了?

TAP的正确用法就是await,await说白了就是编译器帮你把代码翻译成callback形式。


异步当然绕不开重入,重入的实现就是callback,没什么不好理解的。


Task原本是设计给TPL用的,后来搞async的时候懒得搞IPromise了就直接把Task拿来用了。



======================================================

这里稍微补充一下异步方法能不能没有返回值的问题。

按照微软的说法是,允许无返回值方法作为异步方法是一个遗留问题,因为大部分的EventHandler都是无返回值的。如果不允许的话,就会多一些没什么卵用的代码来抛弃返回的Task对象:

       public void EventHandler( object sender, EventArgs e ) {   DoSomethingAsync();//returns a Task }      

事实上无返回值的异步方法和上面这个包装是一样的,就是把Task扔掉仅此而已。


但实际上来讲,无返回值方法作为异步方法,或者说抛弃返回的Task并不是一件不可饶恕的事情。在特定场景下是可以用的,需要满足两个特定的条件:

1、异步方法没有返回值给调用方。

2、调用方压根儿不关心异步方法调用成功与否以及何时完成。

当然,没有返回值也意味着异常无法向外传播,所以方法内最好将异常全部处理完毕。



看了下面的答案,大部分是对的,但也有很多细节有问题。

异步与否与多线程没有必然的关系,Task会在哪个线程执行,完全取决于TaskScheduler,在当前线程直接执行也不是完全不可能的事情。假定异步操作或者Task一定会在另一个线程执行是不正确的。


TAP几乎唯一正确的使用方式就是直接用await,UI线程可以直接用await。当然,你可以认为await本质上也就是ContinueWith的语法糖,但是await可以帮你处理的情况远比你自己写一坨翔好得多。说await只是将代码切成两份未免太天真,考虑下面的代码:

       async Task DoAsync() {   while( true )   {     Console.WriteLine( DateTime.Now );     await Task.Delay( 100 );   } }      

await可以把这段代码切成无限多份


这也是编译器为啥要用状态机的原因,状态机只是实现,具体的实现方式可以有很多种。




  

相关话题

  C# 用OLEDB读取excel文件提示外部表不是预期的格式? 
  大家做课题做项目进行科学研究的过程中编程产生的结果(数字,图像,表格等)都是暂时保存在哪里呢? 
  按照现在硬件发展的速度,是否还需要高效的代码? 
  JAVA语言的优缺点是什么? 
  大一下要学C++,电脑安装不上net4.0,有什么在线编程网站可以尽可能替代VS,拿来练习。? 
  如何从俄乌战争看待推出国产编程语言的紧迫性? 
  写一个什么样的程序向喜欢的妹子表白? 
  有哪些好的C#开源项目推荐? 
  如何分辨验证码的“O”和“0”?程序员能否避免在验证码中出现这2个不容易分辨的字符。 
  C++工程中的目录有何意义? 

前一个讨论
假如你把三国志 孙子兵法 中国地形图熟记于心 外加一吨黄金穿越回三国前期,能否帮助汉献帝一统天下?
下一个讨论
cname记录是什么?他存在的意义是什么?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利