我正在嘗試制作一個簡單的 winforms 應用程式來將影像轉換為 Base64。在除錯時,我注意到當我單擊按鈕轉換為 base64 時 ui 凍結,因此我開始更改代碼以異步呼叫該方法。(碰巧我從未使用過異步方法,所以我有點不知道我在做什么)
我的 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 仍然凍結,我可以做些什么來解決這個問題?
uj5u.com熱心網友回復:
首先,代碼阻塞了任務。其次,該方法ToBase64最終生成并編碼原始位元組,假設由于有損壓縮沒有丟失任何內容。image.Save(m, image.RawFormat);以原始格式保存影像資料,因此最多只能生成相同的資料。
代碼可以簡化為:
private async void button2_Click(object sender, EventArgs e)
{
//Only needed to provide a visual cue
imageCode.Text="";
var bytes=await File.ReadAllBytes(imageDialog.FileName);
imageCode.Text = await Task.Run(()=>Convert.ToBase64String(bytes));
}
Image如果您想在編碼前將影像轉換為不同的格式,或者您想對原始 RGB 值進行編碼,則使用 是有意義的
uj5u.com熱心網友回復:
原因是這個
imageCode.Text = base64Code.Result;
.Result 將阻塞直到可以生成字串,這可能不是您想要的。
您應該改為使用 async/await:
imageCode.Text = await base64Code;
請注意,這需要將方法標記為異步。而且您可能還想捕獲任何例外,否則它們可能會丟失。
我還建議使用一些分析工具,因為這些工具通常可以告訴您代碼的哪些部分阻塞了 UI。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/386881.html
標籤:C# 视觉工作室 .net-framework-4.8
上一篇:您可以通過VisualStudio安裝程式專案選擇自定義先決條件路徑嗎?
下一篇:粘性導航欄可變大小改變滾動位置
