【问题标题】:Async Task await异步任务等待
【发布时间】:2014-03-18 00:20:09
【问题描述】:

我正在尝试理解 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;
}

【问题讨论】:

  • @L.B 你不能在main 方法中使用await asyncValue,因为它没有被标记为async,你不能将主标记为异步。
  • @user3046164:您可能会发现我的 async introasync console app 博客文章很有用。

标签: c# .net wcf async-await


【解决方案1】:

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

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

  Console.WriteLine(asyncValue.Result);

调用Result,会Wait完成任务,然后得到结果。

【讨论】:

    【解决方案2】:

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

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

    试试吧:

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

    【讨论】:

      【解决方案3】:

      为了使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

      【讨论】:

      • 我现在明白了。我必须创建一个示例来学习和理解,但我陷入了困境。非常感谢:)
      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 2013-02-10
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2014-10-01
      • 1970-01-01
      相关资源
      最近更新 更多