我在我的 c# 代碼中下載檔案時遇到問題。
public Form1()
{
InitializeComponent();
DownloadFile().Wait();
}
private async Task DownloadFile()
{
Debug.WriteLine("Download");// appears
HttpClient client = new();
var response = await client.GetAsync("file");
Debug.WriteLine("End download");// does not display
}
下載后執行緒停止,但應用程式未顯示。
Le thread 0x7d28 s'est arrêté avec le code 0 (0x0).
Le thread 0x7998 s'est arrêté avec le code 0 (0x0)。
Le thread 0x269c s'est arrêté avec le code 0 (0x0)。
Le thread 0x7e74 s'est arrêté avec le code 0 (0x0)。
Le thread 0x534c s'est arrêté avec le code 0 (0x0).
Le thread 0x77f0 s'est arrêté avec le code 0 (0x0).
Le thread 0x70fc s'est arrêté avec le code 0 (0x0).
Le thread 0x7428 s'est arrêté avec le code 0 (0x0)。
Le thread 0x5628 s'est arrêté avec le code 0 (0x0).
Le thread 0x788c s'est arrêté avec le code 0 (0x0).
Le thread 0x63f4 s'est arrêté avec le code 0 (0x0)。
uj5u.com熱心網友回復:
經典的 HttpClient 錯誤。在主執行緒上等待時會導致死鎖。ConfigureAwait(false)用于解決此類問題的存在不適用于HttpClient...
為此,您需要在另一個執行緒上強制執行 http 呼叫。為此,您可以將 http 呼叫封裝在如下任務中:
private async Task DownloadFile()
{
Debug.WriteLine("Download");
HttpClient client = new();
var response = await Task.Run(() =>await client.GetAsync("file"));
Debug.WriteLine("End download");
}
從 .NET 5 開始,HttpClient具有(最終)同步方法:
private void DownloadFile()
{
Debug.WriteLine("Download");
HttpClient client = new();
var response = client.Get("file");
Debug.WriteLine("End download");
}
但是在建構式或 UI 程式的主執行緒上做繁重的作業是一種不好的做法。也許你可以考慮使用Form.Load事件。
uj5u.com熱心網友回復:
不要將 async / await 與 Wait() 或 Result 結合使用,因為它會導致死鎖。
為了避免 SynchronizationContext 中的死鎖,您應該使用 ConfigureAwait(false):
private async Task DownloadFile()
{
Debug.WriteLine("Download");// appears
HttpClient client = new();
var response = await client.GetAsync("file").ConfigureAwait(false);
Debug.WriteLine("End download");// does not display
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/516754.html
標籤:C#表格
上一篇:保存自動遞增的文本檔案file_01.txt、file_02.txt、file_03.txtC#
下一篇:如何更改工具提示文本的字體大小?
