【异步编程 笔记】【何时使用Task.Run】

286 阅读1分钟

当我们想要在不依赖于所使用的库是否提供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

Image.png

Image.png


解决办法:将block UI的同步操作转变成异步操作来完成。

Image.png

Image.png


将同步方法变成异步方法的时候尤其要注意一点,那就是抽出来的异步方法里面不要含有阻塞UI的操作。


Task 也可以通过加await来控制执行顺序

Image.png

Image.png


Task.Run可以返回值

Task.Run 可以返回东西

  • 这里返回 lines, 是返回一个string 数组, string []
  • 但是可以不写成Task.Run<string[]>() , 而是只写成Task.Run()

Image.png