当前位置: 首页 > 编程语言 > C#

如何在C#中等待任务完成?

时间:2023-04-10 10:57:01 C#

我如何在C#中等待任务完成?我想向服务器发送请求并处理返回值:privatestaticstringSend(intid){TaskresponseTask=client.GetAsync("aaaaa");字符串结果=string.Empty;responseTask.ContinueWith(x=>result=Print(x));responseTask.Wait();//不等待响应任务完成返回结果;}privatestaticstringPrint(TaskhttpTask){Tasktask=httpTask.Result.Content.ReadAsStringAsync();字符串结果=string.Empty;task.ContinueWith(t=>{Console.WriteLine("Result:"+t.Result);result=t.Result;});任务.等待();//它等待返回结果;我是否正确使用了Task?我不这么认为,因为Send()方法每次都返回string.Empty,而Print返回正确的值。我究竟做错了什么?如何从服务器获取正确的结果?您的Print方法可能需要等待延续完成(ContinueWith返回一个您可以等待的任务)。否则,第二个ReadAsStringAsync结束并且该方法返回(在继续分配结果之前)。您的send方法中存在同样的问题。两者都需要等待延续才能始终如一地得到想要的结果。类似于privatestaticstringSend(intid){TaskresponseTask=client.GetAsync("aaaaa");字符串结果=string.Empty;任务继续=responseTask.ContinueWith(x=>result=Print(x));继续.Wait();返回结果;}privatestaticstringPrint(TaskhttpTask){Tasktask=httpTask.Result.Content.ReadAsStringAsync();字符串结果=string.Empty;任务继续=task.ContinueWith(t=>{Console.WriteLine("Result:"+t.Result);result=t.Result;});继续。等待();返回结果;它等待client.GetAsync("aaaaa");但不是result=Print(x)tryresponseTask.ContinueWith(x=>result=Print(x)).Wait()-编辑-TaskresponseTask=Task.Run(()=>{Thread.Sleep(1000);Console.WriteLine("任务中");});responseTask.ContinueWith(t=>Console.WriteLine("InContinueWith"));responseTask.Wait();Console.WriteLine("结束");上面的代码不保证输出:IntaskInContinueWithEndbutdothis(seenewTask)TaskresponseTask=Task.Run(()=>{Thread.Sleep(1000);Console.WriteLine("任务中");});任务newTask=responseTask.ContinueWith(t=>Console.WriteLine("InContinueWith"));新任务等待();Console.WriteLine("结束");我是异步的新手,所以我不能明确地告诉你这里发生了什么。我怀疑方法执行预期不匹配,即使您在方法内部使用任务也是如此。如果您更改Print以返回任务,我想您会得到预期的结果:privatestaticstringSend(intid){TaskresponseTask=client.GetAsync("aaaaa");任务结果;responseTask.ContinueWith(x=>result=Print(x));结果.等待();responseTask.Wait();//可能有更好的方法来等待这两个任务,而不必以这种笨拙、连续的方式进行。返回结果。结果;}privatestaticTaskPrint(TaskhttpTask){Tasktask=httpTask.Result.Content.ReadAsStringAsync();字符串结果=string.Empty;task.ContinueWith(t=>{Console.WriteLine("Result:"+t.Result);result=t.Result;});回归任务;当使用continuations时,我发现把我写的.ContinueWith想象成一个地方是有用的,在这个地方执行会立即继续执行它后面的语句,而不是语句“inside”。在这种情况下,显然您在Send中返回了一个空字符串。如果您对响应做的唯一事情是将其写入控制台,则不需要任何WaitinIto解决方案-控制台打印输出将等待而不等待,但在这种情况下,发送和打印都应返回void。在控制台应用程序中运行此命令,您将获得页面的打印输出。IMO,有时需要await和Task.Result调用(哪个块),具体取决于您所需的控制流,但更多时候它们表明您没有真正正确使用异步函数。namespaceTaskTest{classProgram{staticvoidMain(string[]args){Send();Console.WriteLine("回车退出");控制台.ReadLine();}privatestaticvoidSend(){HttpClientclient=newHttpClient();任务responseTask=client.GetAsync("http://google.com");responseTask.ContinueWith(x=>Print(x));}privatestaticvoidPrint(TaskhttpTask){Tasktask=httpTask.Result.Content.ReadAsStringAsync();任务继续=task.ContinueWith(t=>{Console.WriteLine("Result:"+t.Result);});}}}asyncTaskAccessTheWebAsync(){//您需要添加对System.Net.Http的引用以声明客户端。HttpClient客户端=newHttpClient();//GetStringAsync返回一个任务。这意味着当您等待//任务时,您将获得一个字符串(urlContents)。任务getStringTask=client.GetStringAsync("http://msdn.microsoft.com");//您可以在此处执行不依赖于GetStringAsync中的字符串的工作。做独立工作();//等待运算符sus挂起AccessTheWebAsync。//-在getStringTask完成之前,AccessTheWebAsync无法继续。//-同时,控制返回给AccessTheWebAsync的调用者。//-当getStringTask完成时控制在这里恢复。//-然后await运算符从getStringTask中检索字符串结果。字符串urlContents=等待getStringTask;//return语句指定一个整数结果。//任何等待AccessTheWebenter代码的方法在这里Async检索长度值。返回urlContents.Length;C#学习教程:如何在C#中等待任务完成?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——stringoutput="Error";任务task=Task.Factory.StartNew(()=>{System.Threading.Thread.Sleep(2000);output="Complete";});任务.等待();控制台.WriteLine(输出);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。转载请注明出处: