gpt4 book ai didi

c# - 如何使函数异步运行

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

我正在阅读有关异步等待编程的内容,但我对要使函数异步运行的场景感到困惑。例如,我想在我的 UI 上显示一个图像。因此,在 UI 线程上,我调用了一个函数,该函数将从存储中获取图像并将图像应用到 UI 上。

正确的做法是什么?

方法一

private async void SetImage()
{
await Task.Run(() =>
{
byte[] fullViewImageBytes = Utils.GetImageFromStorage(fileName);

if (fullViewImageBytes != null)
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
MemoryStream memStream = new MemoryStream(fullViewImageBytes);
BitmapImage image = new BitmapImage();
image.SetSource(memStream);
userImage.Source = image;
});
}
}
}

方法二

private async void SetImage()
{
await Task.Delay(1);

byte[] fullViewImageBytes = Utils.GetImageFromStorage(fileName);

if (fullViewImageBytes != null)
{
MemoryStream memStream = new MemoryStream(fullViewImageBytes);
BitmapImage image = new BitmapImage();
image.SetSource(memStream);
userImage.Source = image;
}
}

最佳答案

由于从磁盘读取文件主要是关于异步 IO,您可以利用 Windows Phone 平台提供的范围广泛的异步 API。

不需要使用 Task.Factory.StartNewTask.Run,这意味着根本不需要额外的 ThreadPool 线程。目前,您的代码并不是真正的异步代码,请注意 async void 仅适用于顶级事件处理程序,不应在其他情况下使用。

您可以按如下方式利用异步 API:

public async Task<BitmapImage> CreateImageFromFileAsync(string imagePath)
{
StorageFile storageFile = await StorageFile.GetFileFromPathAsync(imagePath);
IRandomAccessStream imageFileStream = await storageFile.OpenReadAsync();

BitmapImage image = new BitmapImage();
await image.SetSourceAsync(imageFileStream);

return image;
}

关于c# - 如何使函数异步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082190/

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