【问题标题】:How to call async task by using .ContinueWith如何使用 .ContinueWith 调用异步任务
【发布时间】:2013-06-28 02:11:27
【问题描述】:

我正在用几个位图构建一个位图。我所做的是调用多个返回任务的方法。

我遇到的问题是死锁,因为我试图通过 .Result 从 .ContinueWith() 中的异步方法中检索值,但这不起作用,因为它变成了异步方法 int 一个同步方法,这导致我陷入死锁。

我的问题是如何调用 .ContinueWith 中的异步方法,或者实现此类方法的正确方法是什么?

我需要删除 .Result 并正确调用异步方法 Task。正确的方法是什么?

这是我的代码。

 public async static Task<Bitmap> RollUpDrawingsImage(IElevation elevation)
{
    int height = 0, width = 800;
    Bitmap completeDrawings = null;

    using (Bitmap elevationDoor = await ShopDrawing.Merger.MergeElevationAndDoor(elevation, RotateFlipType.Rotate90FlipNone))
    {
        using (Bitmap partsList = await MaterialsList.Manager.GetMaterialList(elevation).ContinueWith(async (ml) => await ml.Result.GetDrawing()).Result)
        {
            using (Bitmap optimized = await Optimization.Manager.GetOptimizedParts(elevation).ContinueWith(async (op) => await op.Result.GetDrawing()).Result)
            {
                using (Bitmap cutSheet = await CutSheet.Manager.GetCutSheet(elevation).ContinueWith(async (cs) => await cs.Result.GetDrawing()).Result)
                {
                    height = (elevationDoor.Height + optimized.Height + cutSheet.Height + partsList.Height);
                    completeDrawings = new Bitmap(width, height + 40);

                    using (var dc = Graphics.FromImage(completeDrawings))
                    {
                        dc.DrawImageUnscaled(elevationDoor, 0, 0);

                        dc.DrawImageUnscaled(partsList, 0, elevationDoor.Height + 10);

                        dc.DrawImageUnscaled(optimized, 0, (elevationDoor.Height + partsList.Height) + 20);

                        dc.DrawImageUnscaled(cutSheet, 0, (elevationDoor.Height + partsList.Height + optimized.Height) + 30);
                    };

                    return completeDrawings;
                }
            }
        }
    };
}

【问题讨论】:

    标签: c# bitmap task-parallel-library .net-4.5 async-await


    【解决方案1】:

    是什么让你觉得你需要ContinueWith

    Result 的适当替换是 await。附带说明一下,您应该以“Async”结束async 方法:

    public async static Task<Bitmap> RollUpDrawingsImage(IElevation elevation)
    {
      int height = 0, width = 800;
      Bitmap completeDrawings = null;
    
      using (Bitmap elevationDoor = await ShopDrawing.Merger.MergeElevationAndDoorAsync(elevation, RotateFlipType.Rotate90FlipNone))
      using (Bitmap partsList = await (await MaterialsList.Manager.GetMaterialListAsync(elevation)).GetDrawingAsync())
      using (Bitmap optimized = await (await Optimization.Manager.GetOptimizedPartsAsync(elevation)).GetDrawingAsync())
      using (Bitmap cutSheet = await (await CutSheet.Manager.GetCutSheetAsync(elevation)).GetDrawingAsync())
      {
        height = (elevationDoor.Height + optimized.Height + cutSheet.Height + partsList.Height);
        completeDrawings = new Bitmap(width, height + 40);
    
        using (var dc = Graphics.FromImage(completeDrawings))
        {
          dc.DrawImageUnscaled(elevationDoor, 0, 0);
          dc.DrawImageUnscaled(partsList, 0, elevationDoor.Height + 10);
          dc.DrawImageUnscaled(optimized, 0, (elevationDoor.Height + partsList.Height) + 20);
          dc.DrawImageUnscaled(cutSheet, 0, (elevationDoor.Height + partsList.Height + optimized.Height) + 30);
        }
    
        return completeDrawings;
      }
    }
    

    【讨论】:

    • 我想用 async 扩展我的异步方法的结尾。如果我返回一个 Task 怎么办?该方法是否需要异步?
    • 是的,应该以Async结尾。
    • 再次感谢斯蒂芬!他们应该称你为 Async 年度人物!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多