我需要知道是否有一种方法可以执行DownloadPage(结果),而无需立即进入我的main方法中的Console.ReadKey().
发生的事情是DownloadPage触发,但在显示"你想将它保存到.txt文件吗?[Y/N]"之后,程序在输入任何键后结束.我最初在GetPageHTML中尝试了整个方法,但是一旦我尝试获取用户输入它就会一直破坏.
我还在学习C#,我不知道如何处理问题并纠正它.有人可以帮忙吗?
using System; using System.IO; using System.Net.Http; using System.Text.RegularExpressions; namespace Programming_Challenge_4 { class Program { static void Main(string[] args) { Console.Write("Enter URL: "); string url = Console.ReadLine(); GetPageHTML(url); Console.ReadKey(); } static async void GetPageHTML(string _url) { try { using (HttpClient client = new HttpClient()) using (HttpResponseMessage response = await client.GetAsync(_url)) using (HttpContent content = response.Content) { string result = await content.ReadAsStringAsync(); string title = Regex.Match(result, @"\s*(.*?)\s* ").Groups[1].Value; Console.WriteLine("Downloading HTML...\n\nTitle: {0}\n\n{1}\n\n", title, result); DownloadPage(result); } } catch (Exception) { Console.WriteLine("There was an error reading the url \"{0}\".", _url); } } static void DownloadPage(string _html) { Console.WriteLine("Would you like to save this to a .txt file? [Y/N]"); string saveFile = Console.ReadLine(); // CODE IS BREAKING HERE! if (saveFile.ToUpper() == "Y") { Console.Write("Please provide a file name: "); string name = Console.ReadLine(); using (StreamWriter writer = new StreamWriter(name + ".txt")) { writer.Write(_html); writer.Close(); } Console.WriteLine("HTML has been saved to {0}.txt!", name); } } } }
Jon Skeet.. 8
是的 - 你不是在等待异步操作真正完成.您应该声明要返回的方法Task
,如下所示:
static async Task GetPageHtml(string _url)
然后在你的Main
方法中等待它:
GetPageHtml(url).Wait();
现在通常情况下,阻止某个任务像这样同步完成是一个坏主意,因为你最终可能会阻塞需要完成工作的同一个线程 - 但是控制台应用程序的主线程没有同步上下文,所以继续异步方法将在线程池线程中运行...所以这Wait()
是安全的.
当然,这在某种程度上打败了使用异步的一部分 - 但如果你只是在探索异步,那很好.
通常,应该声明方法的唯一时间是,您可以将其用作事件处理程序.async
void
是的 - 你不是在等待异步操作真正完成.您应该声明要返回的方法Task
,如下所示:
static async Task GetPageHtml(string _url)
然后在你的Main
方法中等待它:
GetPageHtml(url).Wait();
现在通常情况下,阻止某个任务像这样同步完成是一个坏主意,因为你最终可能会阻塞需要完成工作的同一个线程 - 但是控制台应用程序的主线程没有同步上下文,所以继续异步方法将在线程池线程中运行...所以这Wait()
是安全的.
当然,这在某种程度上打败了使用异步的一部分 - 但如果你只是在探索异步,那很好.
通常,应该声明方法的唯一时间是,您可以将其用作事件处理程序.async
void