我试图理解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;
}
答案 0 :(得分:2)
要使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
。
答案 1 :(得分:1)
您的main
方法在WCF调用返回之前结束。
要查看结果,您可以添加以下行:
Console.WriteLine(asyncValue.Result);
答案 2 :(得分:1)
asyncValue
是一个任务,Result
将在完成时包含最终值。您必须通过致电asyncValue.Result
或致电asyncValue.Wait()
,然后点击asyncValue.Result
等待此结果。
您无法在控制台计划的await asyncValue
方法中使用await GetAsyncTimeFromWcf()
或Main
,因为您无法将其标记为async
。
试试吧:
Task<string> asyncValue = GetAsyncTimeFromWcf();
var time=asyncValue.Result;
Console.WriteLine(time);