Csharp/C#教程:如何正确编写异步方法?分享


如何正确编写异步方法?

所以我想学习在C#中使用’async’和’await’的基础知识,但我不确定我在这里做错了什么。 我期待以下输出:

Calling DoDownload DoDownload done [...output here...] 

但我没有得到下载的输出,我也期望“完成”,但这需要一段时间。 不应该立即输出吗? 此外,我似乎无法获得字符串结果。 这是我的代码:

 namespace AsyncTest { class Program { static void Main(string[] args) { Debug.WriteLine("Calling DoDownload"); DoDownloadAsync(); Debug.WriteLine("DoDownload done"); } private static async void DoDownloadAsync() { WebClient w = new WebClient(); string txt = await w.DownloadStringTaskAsync("https://www.google.com/"); Debug.WriteLine(txt); } } } 

要获得所需的行为,您需要在退出Main()之前等待该过程完成。 为了能够告诉您的进程何时完成,您需要返回一个Task而不是函数中的void ,除非您正在处理事件,否则不应该从async函数返回void

正确运行的程序的重写版本将是

 class Program { static void Main(string[] args) { Debug.WriteLine("Calling DoDownload"); var downloadTask = DoDownloadAsync(); Debug.WriteLine("DoDownload done"); downloadTask.Wait(); //Waits for the background task to complete before finishing. } private static async Task DoDownloadAsync() { WebClient w = new WebClient(); string txt = await w.DownloadStringTaskAsync("https://www.google.com/"); Debug.WriteLine(txt); } } 

因为您无法在Main() await ,所以我必须执行Wait()函数。 如果这是一个具有SynchronizationContext的应用程序,我会await downloadTask; 相反,并使该函数从async调用。

您正在调用DoDownloadAsync(),但您不等待它。 所以你的程序将进入下一行。 但是还有另一个问题,Async方法应该返回TaskTask ,如果你什么都不返回,并且你希望你的方法是异步运行的,你应该像这样定义你的方法:

 private static async Task DoDownloadAsync() { WebClient w = new WebClient(); string txt = await w.DownloadStringTaskAsync("https://www.google.com/"); Debug.WriteLine(txt); } 

并且在Main方法中,您无法等待DoDownloadAsync ,因为您不能在非异步函数中使用await关键字,并且您无法进行Main异步。 所以考虑一下:

上述就是C#学习教程:如何正确编写异步方法?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 var result = DoDownloadAsync(); Debug.WriteLine("DoDownload done"); result.Wait(); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/950578.html

(0)
上一篇 2021年11月17日
下一篇 2021年11月17日

精彩推荐