最佳解答者
請教HttpClient async問題

問題
-
老師前輩好
我在如下程式
將取得的內容寫入至txt,如果沒加入Thread.Sleep(2000)的話
就無法將取得的內容寫入至txt,debug也沒看到執行
我想請教的是,async的架構下 怎樣才能將取得的內容寫入至txt?此程式必須設定能設定排程自動執行,謝謝
我要再了解學習何內容,謝謝
static void Main(string[] args)
static async void MyHttpClientPage(string url)
{
JobStart();
try
{
MyHttpClientPage("https://rate.bot.com.tw/xrt/fltxt/0/day");
}
catch (Exception ex)
{
JobEnd();
AddLog(ex.Message + " " + ex.StackTrace.Replace("\r\n", ""));
}
JobEnd();
Thread.Sleep(2000);
}
{
using (HttpClient client = new HttpClient())
{
try
{
string responseBody = "";
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
responseBody = await response.Content.ReadAsStringAsync();
//Console.WriteLine(responseBody);
string FileName = "D:\\xxx\\xxx_Bank\\TXT\\TW_rate_HttpClient_" + System.DateTime.Now.ToString("yyyyMMdd") + ".txt";
StreamWriter objWriter = new StreamWriter(FileName, true, System.Text.Encoding.GetEncoding("utf-8"));
objWriter.Write(responseBody);
objWriter.Close();
objWriter = null;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
}
}
}
解答
-
因為在你的 Main 方法裡面並沒有等待非同步的 MyHttpClientPage 方法完成就繼續往下了。
如果 C# 的版本允許 (C# 7.1) 以上,可以修改為以下:
(1) Main 方法宣告修改為非同步
static async Task Main(string[] args)
(2) MyHttpClientPage 方法宣告改為可等待的非同步 (亦即回傳 Task)
static async Task MyHttpClientPage(string url)
(3) Main 方法內呼叫 MyHttpClientPage 的部分加上 await 以等待非同步方法完成
try { await MyHttpClientPage("https://rate.bot.com.tw/xrt/fltxt/0/day"); }
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/
- 已標示為解答 effor 2022年6月21日 上午 02:37
-
可以參考微軟文件
https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/async/
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/
- 已標示為解答 effor 2022年6月21日 下午 11:58
所有回覆
-
因為在你的 Main 方法裡面並沒有等待非同步的 MyHttpClientPage 方法完成就繼續往下了。
如果 C# 的版本允許 (C# 7.1) 以上,可以修改為以下:
(1) Main 方法宣告修改為非同步
static async Task Main(string[] args)
(2) MyHttpClientPage 方法宣告改為可等待的非同步 (亦即回傳 Task)
static async Task MyHttpClientPage(string url)
(3) Main 方法內呼叫 MyHttpClientPage 的部分加上 await 以等待非同步方法完成
try { await MyHttpClientPage("https://rate.bot.com.tw/xrt/fltxt/0/day"); }
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/
- 已標示為解答 effor 2022年6月21日 上午 02:37
-
老師您好
謝謝您的回覆
一開始遇到程式未包含適合進入點的靜態 'Main' 方法的問題,google後有將專案改成C# 7.3
程式已正常執行了。
因此例下載匯率,都是用非同步方法,想請問建議的參考文章? 以學習及了解用法,謝謝您最後,請教如下程式寫法架構是否正確無誤? 謝謝
其中JobStart() JobEnd() AddLog() 只是單純記錄log
RateToFile() 是將取得網頁的內容responseBody寫到txt
static async Task Main(string[] args) { JobStart(); try { await MyHttpClientPage("https://rate.bot.com.tw/xrt/fltxt/0/day"); RateToFile(); } catch (Exception ex) { JobEnd(); AddLog(ex.Message + " " + ex.StackTrace.Replace("\r\n", "")); } JobEnd(); }
-
可以參考微軟文件
https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/async/
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/
- 已標示為解答 effor 2022年6月21日 下午 11:58