当我们想要在不依赖于所使用的库是否提供
async
方法的情况下,依然想引入asynchronous principle的话,就可以使用Task
我们使用
Task.Run()
的绝好时机就是:没有现成Aysnc接口可用,但是依然想用异步执行的特性时。
Task
- 代表一个异步操作
- 它使得我们可以,从异步操作中得到 result,
- 它使得我们可以,设定当异步操作结束的时候,开启另一个工作
- 它使得我们,当得知有问题时, cancel 异步操作
Task.Run
Task.Run
会将要做的事queue在thread pool里, 然后返回一个Task
来代表正在发生的事,只要有空闲thread就会执行queue的事情- queue 东西是在瞬间完成的,所以紧接着就会往下继续执行
Task.Run<T>
返回的结果是T
类型, 但是我们一般不显示使用Task.Run<T>
. 因为当我们的action真的返回什么东西的话,会自动从Task.Run invert成Task.Run<T>
,会自动推断返回的是什么类型。
示例
下面有一个例子:
- 点击search 按钮,从csv中读取微软的股票,并显示在UI grid里
- 读取csv文件和处理文件内容比较耗时,UI不能及时响应用户的其他操作,比如填写Notes
解决办法:将block UI的同步操作转变成异步操作来完成。
将同步方法变成异步方法的时候尤其要注意一点,那就是抽出来的异步方法里面不要含有阻塞UI的操作。
Task
也可以通过加await
来控制执行顺序
Task.Run可以返回值
Task.Run
可以返回东西
- 这里返回 lines, 是返回一个
string
数组,string []
- 但是可以不写成
Task.Run<string[]>()
, 而是只写成Task.Run()