gpt4 book ai didi

c# - 展开异步操作及其在 TaskCompletionSource 中的异步回调

转载 作者:行者123 更新时间:2023-11-30 20:40:37 30 4
gpt4 key购买 nike

我的 View 模型调用服务中的一个方法来获取图像。图像是从外部库(Xamarin 中的 iOS API)获取的,它使用回调机制而不是等待。

为了使我的方法可等待,我将该方法包装在 TaskCompletionSource 中。尽管问题出在 API 回调中,但我需要调用另一个必须返回任务的方法。完成源将其结果设置为 Task<IBitmap> ,然后我返回 CompletionSource Task,它现在变为 Task<Task<IBitmap>>所以我最终得到的最终返回值是 Task<Task<IBitmap>>而不仅仅是 Task<Bitmap> .

public Task<IBitmap> GetAlbumCoverImage(IAlbum album)
{
var assets = PHAsset.FetchAssetsUsingLocalIdentifiers(new string[] { album.Identifier }, null);

var asset = assets.FirstOrDefault(item => item is PHAsset);
if(asset == null)
{
return null;
}

var taskCompletionSource = new TaskCompletionSource<Task<IBitmap>>();
PHImageManager.DefaultManager.RequestImageForAsset(
asset,
new CoreGraphics.CGSize(512, 512),
PHImageContentMode.AspectFit,
null,
(image, info) => taskCompletionSource.SetResult(this.ConvertUIImageToBitmap(image)));

return taskCompletionSource.Task;
}

private Task<IBitmap> ConvertUIImageToBitmap(UIImage image)
{
var imageData = image.AsJPEG().GetBase64EncodedData(Foundation.NSDataBase64EncodingOptions.SixtyFourCharacterLineLength);
byte[] imageBytes = new byte[imageData.Count()];

System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, imageBytes, 0, Convert.ToInt32(imageData.Count()));

return BitmapLoader.Current.Load(new MemoryStream(imageBytes), 512, 512);
}

我应该如何展开嵌套任务,以便只返回 Task<IBitmap>

最佳答案

您不需要使用 TaskCompletionSource<Task<IBitmap>> , 使用 TaskCompletionSource<UIImage>它返回一个任务,完成后返回一个图像。等待该任务异步获取结果,然后您可以使用 ConvertUIImageToBitmap 进行转换:

public async Task<IBitmap> GetAlbumCoverImage(IAlbum album)
{
// ...
var taskCompletionSource = new TaskCompletionSource<UIImage>(); // create the completion source
PHImageManager.DefaultManager.RequestImageForAsset(
asset,
new CoreGraphics.CGSize(512, 512),
PHImageContentMode.AspectFit,
null,
(image, info) => taskCompletionSource.SetResult(image)); // set its result

UIImage image = await taskCompletionSource.Task; // asynchronously wait for the result
return await ConvertUIImageToBitmap(image); // convert it
}

关于c# - 展开异步操作及其在 TaskCompletionSource 中的异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191067/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com