繁体   English   中英

等待异步任务

[英]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

您的main方法在WCF调用返回之前结束。

要查看结果,可以添加以下行:

  Console.WriteLine(asyncValue.Result);

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

asyncValue是一个Task,其Task完成时其Result将包含最终值。 您必须通过调用asyncValue.Result或通过调用asyncValue.Wait()等待此结果,然后检查asyncValue.Result

您不能在控制台程序的Main方法中使用await asyncValueawait GetAsyncTimeFromWcf() ,因为您无法将其标记为async

你试一试:

Task<string> asyncValue = GetAsyncTimeFromWcf(); 
var time=asyncValue.Result;
Console.WriteLine(time);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM