异步任务等待

时间:2014-02-18 10:14:24

标签: c# .net wcf async-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;
}

3 个答案:

答案 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);

Result的调用,Wait将完成任务,然后获得结果。

答案 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);