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



C# 异步中Task.Wait的坑? C# Task.Wait为什么不等待就返回? 第1页

  

user avatar   Ivony 网友的相关建议: 
      

你看了Task构造函数的帮助文档了没?

不看文档瞎几把写,当然到处都是坑……


Task的构造函数压根儿就没有接收异步方法的重载,这意味着Task的构造函数只会把这个方法当作普通的同步方法来执行,并创建一个Task用来调度这个方法。而异步方法直接调用的时候,就是一个返回或者不返回Task对象的普通方法。


别说文档了,就是智能提示你都能清晰的看到new的到底是哪个重载,进而意识到问题……


当然你非要说坑,那只有一个,就是无返回值的异步方法允许为void AsyncMethod( ... )的签名形式。这个是因为WinForm的事件处理函数都是无返回值的,而如果事件处理函数为异步方法,就会出现问题,做的特殊规定。



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

多说两句好了,关于Task的。


其实我早就说过微软在搞async的时候偷了懒,异步方法直接返回Task而不是IAsyncHandler,结果搞出很多容易混乱的问题,异步方法返回的Task和TPL里面的Task虽然是一个类型但其实是不同的东西。TPL的Task本质上是对方法调用(Invoke)的一个包装,可以被调度器(TaskScheduler)派送(Dispatch)到某个线程(Thread)上去执行(Run)。


而TAP的Task则纯粹是已经被派送(Dispatch)的执行绪的封装,换言之说白了TAP的Task没有Start这个方法,因为这货本质上只是后半截执行(Run)的状态的封装。

它可以Wait,也可以访问Result,还可以ContinueWith,但是不能被Dispatch和Start,甚至也不需要Dispose,但是因为共用了Task类型,所以多出一大堆没用的玩意儿,例如Start、RunSynchonize什么的。但现在改也改不动了,其实完全没必要偷这个懒……




  

相关话题

  为什么很多人都说使用微软技术的公司是小公司?是不是微软的技术入门简单? 
  C# 虽然在语言层面上更胜 Java 一筹,但是这对于占有率真的很重要吗? 
  为什么C#中型变不能直接修饰在类定义上? 
  C#新启线程导致主线程卡住的问题? 
  C#中关于List<T>和HashSet<T>应用的效率问题? 
  为什么unity愿意用c#作为代码语言,而虚幻却使用c++? 
  .net程序卡死是不是和修复的漏洞有关系? 
  C#中的String.Format()这两种写法那个更好? 
  C++ 和 Java 同样是静态语言,为什么 Java 的代码提示可以做的十分强大? 
  为什么叫.NET?它和C#是什么关系? 

前一个讨论
如何用c#实现一个没有装箱的通用容器?
下一个讨论
有理数a/b的乘法为什么能先定义下来,为什么不怕会有问题?





© 2024-12-18 - tinynew.org. All Rights Reserved.
© 2024-12-18 - tinynew.org. 保留所有权利