none
請教HttpClient async問題 RRS feed

  • 問題

  • 老師前輩好

    我在如下程式
    將取得的內容寫入至txt,如果沒加入Thread.Sleep(2000)的話
    就無法將取得的內容寫入至txt,debug也沒看到執行
    我想請教的是,async的架構下 怎樣才能將取得的內容寫入至txt?

    此程式必須設定能設定排程自動執行,謝謝

    我要再了解學習何內容,謝謝

                  

    static void Main(string[] args)
            {

              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);

            }

     static async void MyHttpClientPage(string url)
         
            {                 

                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);
                    }
                }      
            }

    2022年6月20日 上午 07:50

解答

  • 因為在你的 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
    2022年6月20日 下午 06:36
  • 可以參考微軟文件

    https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/async/


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 effor 2022年6月21日 下午 11:58
    2022年6月21日 下午 12:13

所有回覆

  • JobStart和JobEnd做了什麼事?
    2022年6月20日 上午 09:38
  • 因為在你的 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
    2022年6月20日 下午 06:36
  • 老師您好

    謝謝您的回覆
    一開始遇到程式未包含適合進入點的靜態 '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();
            }

    2022年6月21日 上午 02:55
  • 可以參考微軟文件

    https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/async/


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 effor 2022年6月21日 下午 11:58
    2022年6月21日 下午 12:13