【问题标题】:When has my async function finished我的异步功能何时完成
【发布时间】:2014-11-06 09:59:55
【问题描述】:

我编写了一个 C# void async 函数,它采用以下参数:

  1. string 网址
  2. Bitmap 对象

该函数然后从文件缓存、内存缓存中检索 url 或从网站异步下载 url。

我的问题是:我如何知道Bitmap 对象何时填充了图像,以便我可以在我的代码中使用这个Bitmap 图像?

提前致谢。

【问题讨论】:

    标签: c# function asynchronous bitmap void


    【解决方案1】:

    没有简单的方法知道 async void 方法何时完成。将方法的返回类型从void 更改为Task。返回指示操作何时完成的任务。

    然后在客户端代码中等待Task 完成就很简单了。一旦Task 完成,您就可以使用您的Bitmap

    如果您从某个来源下载位图,最好返回Task<Bitmap>,而不是传递Bitmap 作为参数并对其进行修改。 (如果我理解有问题,请忽略它)。

    【讨论】:

      【解决方案2】:

      如果您想检查位图何时准备就绪,最简单的方法是将您的方法转换为如下所示:

      async Task<bool> myMethod(myParamter) {
      
          //DO Something
          return true;
      
      }
      

      然后按如下方式调用方法

      bool isReady = await myMethod(...)
      

      您还必须更改调用 myMethod 的方法的签名添加异步

      改进版:

      Task<bool> pendingDownload = null;
      
      private async void mainMethod(...) {
          if(pendingDownload != null) {
              MessageBox.Show("Image is not ready!");
              return;
          }
          try{
              pendingDownload = myMethod(...);
              bool isReady = await  pendingDownload;
              MessageBox.Show("Bitmap downloaded");
          } catch(Exception e) {
               MessageBox.Show("Error in downloading image: " + ex.Message);
          }
          pendingDownload = null;
      }
      

      【讨论】:

      • 如果您从不返回除true 之外的任何其他值,那么bool 的意义何在?
      • 这只是一个示例,通常当您下载文件时,您可以有两种状态:true 文件已下载,false 某些错误和下载停止
      • @Tinwor 这应该通过Exception传达。
      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2020-04-02
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多