[英]Async Task await
我试图理解c#中的异步方法,我创建了一个延迟10秒的wcf服务。 我从控制台应用程序调用wcf服务,从未设置值asyncValue 。 它只是关闭控制台应用程序。
为什么asyncValue从未设置为Ok?
Wcf服务
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AsyncService
{
[OperationContract]
public async Task<string> TimeAsync()
{
await Task.Delay(10000);
return "Ok";
}
}
控制台应用
static void Main(string[] args)
{
Task<string> asyncValue = GetAsyncTimeFromWcf();
}
private static async Task<string> GetAsyncTimeFromWcf()
{
AsyncService.AsyncServiceClient client = new AsyncService.AsyncServiceClient();
Task<string> asyncTime = client.TimeAsync();
return await asyncTime;
}
为了使await
关键字有意义,您需要对返回值进行操作。 async
/ await
功能的目的是允许应用程序继续其他不相关的代码,直到您需要使用等待任务的结果为止。
在您的情况下,您调用await
但未使用返回值,因此Main
方法继续并有效地存在该应用程序。 例如,尝试
static void Main(string[] args)
{
Task<string> asyncValue = GetAsyncTimeFromWcf();
Console.WriteLine("Waiting for server...");
Console.WriteLine(String.Format("Result = {0}", asyncValue.Result);
Console.ReadKey();
}
您应该发现控制台将输出Waiting for server...
10秒钟,然后服务器返回后将显示Ok
。
asyncValue
是一个Task,其Task完成时其Result
将包含最终值。 您必须通过调用asyncValue.Result
或通过调用asyncValue.Wait()
等待此结果,然后检查asyncValue.Result
。
您不能在控制台程序的Main
方法中使用await asyncValue
或await GetAsyncTimeFromWcf()
,因为您无法将其标记为async
。
你试一试:
Task<string> asyncValue = GetAsyncTimeFromWcf();
var time=asyncValue.Result;
Console.WriteLine(time);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.