我創建了一個自定義控制元件來顯示影像。顯示的影像必須從網站 url 加載。我決定使用 Tasks 來異步執行操作。這是因為在我的程式運行程序中會加載很多影像。
public Image Image {
get => image;
set {
image = value;
Refresh();
}
}
private Image image;
public async void LoadImageAsync(string url)
{
Image = await GetImageAsync(url);
}
private async Task<Image> GetImageAsync(string url)
{
HttpWebRequest request = WebRequest.CreateHttp(url);
var response = await request.GetResponseAsync();
using (var stream = response.GetResponseStream()) {
return Image.FromStream(stream);
}
}
上面的代碼是我當前的設定。這是使用任務的正確方法嗎?
我來自 JS 和 Promises,所以我從那里學到了知識。我測驗了該方法,它似乎在后臺正確運行。結果影像成功更新 WinForms UI 并Image設定了變數。
uj5u.com熱心網友回復:
首先,void當你有一個異步任務時,你不應該使用關鍵字
其次,您不需要使用 setter 來重繪 UI,最好為 Image 屬性使用不同的名稱。
三、我建議使用HttpClient而不是WebRequest
public Image MyImage { get; set; }
public async Task LoadImageAsync(string url)
{
MyImage = await GetImageAsync(url);
Refresh();
}
private async Task<Image> GetImageAsync(string url)
{
var httpClint = new HttpClient();
var imageBytes = await httpClint.GetStreamAsync(url);
return Image.FromStream(imageBytes)
}
uj5u.com熱心網友回復:
你使用得當。您的代碼準確地說明了async/的預期用途await:您可以像撰寫同步代碼一樣撰寫異步代碼。您撰寫了易于閱讀的代碼,在等待回應時不會鎖定您的 UI。那是你的目標。
如果您還沒有,請閱讀 Microsoft 關于使用 async 和 await進行異步編程的檔案
只是關于您使用HttpWebRequest. 檔案說:
重要的
我們不建議您
HttpWebRequest用于新開發。而是使用System.Net.Http.HttpClient類。
如果你的代碼已經寫好了,你可以保留它。無論如何,我很確定HttpClient只是HttpWebRequest在后臺使用。但這是值得考慮的事情。
uj5u.com熱心網友回復:
由于這是關于在 C# 中使用任務的最佳方法的問題,因此我根據其他答案的建議編譯了我的代碼的最終版本。
static readonly HttpClient client = new HttpClient();
public Image Image {
get => image;
set {
image = value;
Refresh();
}
}
private Image image;
public async void LoadImageAsync(string url)
{
Image = await GetImageAsync(url);
}
private async Task<Image> GetImageAsync(string url)
{
using (Stream stream = await client.GetStreamAsync(url)) {
return Image.FromStream(stream);
}
}
根據其他人的建議,這利用了HttpClient類。
該LoadImageAsync方法的示例執行:
void AnyMethodOrEventHandler()
{
imageControlInstance.LoadImageAsync("http://someurl.com/image.jpg");
}
謝謝大家分享你的知識。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406563.html
標籤:
