【发布时间】:2022-01-19 09:24:53
【问题描述】:
我正在尝试制作一个简单的 winforms 应用程序来将图像转换为 Base64。调试时,我注意到当我单击转换为 base64 的按钮时 ui 冻结,因此我开始更改代码以异步调用该方法。 (碰巧我从来没有使用过 Async 方法,所以我有点不知道自己在做什么)
我的 form1.cs 代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ImageToBase64
{
public partial class main : Form
{
public main()
{
InitializeComponent();
}
Util Util = new Util();
private void button1_Click(object sender, EventArgs e)
{
imageDialog.FileName = "";
imageDialog.Title = "Selecionar Imagem";
imageDialog.Filter = "JPEG|*.JPG|PNG|*.png";
imageDialog.ShowDialog();
imagePathText.Text = imageDialog.FileName;
}
private void button2_Click(object sender, EventArgs e)
{
imageCode.Text = "";
Task<string> base64Code = Task.Run(() => Util.ToBase64(imageDialog.FileName));
imageCode.Text = base64Code.Result;
}
}
}
我的 Util.cs 代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ImageToBase64
{
class Util
{
public async Task<string> ToBase64(string img)
{
string path = img;
using (System.Drawing.Image image = System.Drawing.Image.FromFile(path))
{
using (MemoryStream m = new MemoryStream())
{
image.Save(m, image.RawFormat);
byte[] imageBytes = m.ToArray();
string base64String = null;
base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
}
}
}
即使在进行了这些更改后,UI 仍然冻结,我可以做些什么来解决这个问题?
【问题讨论】:
-
base64Code.Result;- 您正在以同步的方式访问任务的结果,阻止一切。你必须让你的button2_Click异步。 -
请改用
await Task.Run(() => Util.ToBase64(...)。这个方法也很可疑——为什么要使用Image?这将编码原始 RGB 字节而不是文件数据。您可以使用var imageBytes=await File.ReadAllBytesAsync(path); var base64=Convert.ToBase64String(imageBytes);转换文件数据 -
ToBase64没有做任何有用的事情 - 除了由于有损压缩而降低质量之外,它产生的字节与存储在文件中的字节相同。
标签: c# visual-studio .net-framework-4.8