我如何使用async和await

时间:2015-08-04 21:06:28

标签: async-await httpclient webapp2

所以这是我要做的事情的基础...... 我创建了一个具有Web API 2的网站,因此我可以对该网站进行crud操作。

我正在尝试在VS 2013中创建客户端应用程序。我已经创建了一个基本的控制台应用程序来启动项目。

class PortalReposotry
{
    private Uri _uri;
    public PortalReposotry()
    {
        _uri = new Uri("http://localhost:21564/");
    }

    public async Task<CompanyAPI> GetCompany(string companyCode)
    {
        var client = new HttpClient();
        client.BaseAddress = _uri;
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var response = await client.GetAsync(String.Format("api/companies/{0}", companyCode));
        CompanyAPI content = await response.Content.ReadAsAsync<CompanyAPI>();

        return await Task.Run(() => content);
    }
}

class Program
{
    static void Main(string[] args)
    {
        PortalReposotry repo = new PortalReposotry();

        CompanyAPI comp = repo.GetCompany("LNCR");

        Console.ReadKey();
    }
}

我不知道为什么我必须使用lamda表达式来返回CompanyAPI对象。

我希望在CompanyAPI对象中返回所有内容而不是它正在运行的任务。我对线程非常困惑,为什么我必须在任务下运行它...它使得我必须将所有内容包装成一个任务....我说实话我不知道如何使用或从我想要的实际物体中扣除它。

如果你可以帮助我,我可能会走错路,但这是我到目前为止所发现的。

2 个答案:

答案 0 :(得分:3)

  

我对线程非常困惑,为什么我必须在任务

下运行它

您不必在此处使用线程(不需要Task.Run)。 Task<T>类型是“未来” - 它表示将来 的结果值类型为T 的异步操作。这就是为什么你需要使用异步代码的任务(从技术上讲,你可以使用回调,但这更痛苦 - 任务更容易)。

  

我已经创建了一个基本的控制台应用程序来启动项目。

异步控制台应用程序有点奇怪。您需要阻止主线程,以便应用程序不会退出。这在真正的UI客户端应用程序中是不必要的(我假设您的示例项目最终会成为)。所以现在你可以像这样做一个黑客:

static void Main(string[] args)
{
  MainAsync().Wait();
}
static async Task MainAsync()
{
  PortalReposotry repo = new PortalReposotry();
  CompanyAPI comp = await repo.GetCompanyAsync("LNCR");
  Console.ReadKey();
}

Wait()的调用只能在控制台应用的Main方法中完成。您不应该在UI应用程序中调用它。

由于不需要Task.Run,您也可以清理该方法:

public async Task<CompanyAPI> GetCompanyAsync(string companyCode)
{
  var client = new HttpClient();
  client.BaseAddress = _uri;
  client.DefaultRequestHeaders.Accept.Clear();
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

  var response = await client.GetAsync(String.Format("api/companies/{0}", companyCode));
  return await response.Content.ReadAsAsync<CompanyAPI>();
}

答案 1 :(得分:0)

在GetCompany方法中,await和Task.Run是不必要的,你可以只返回内容。

public async Task<CompanyAPI> GetCompany(string companyCode)
{
    var client = new HttpClient();
    client.BaseAddress = _uri;
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new  MediaTypeWithQualityHeaderValue("application/json"));

    var response = await client.GetAsync(String.Format("api/companies/{0}", companyCode));
    CompanyAPI content = await response.Content.ReadAsAsync<CompanyAPI>();

    return content
}

然后在你的主要方法中,你可以这样称呼它。免责声明 这将使它同步运行。您可以使用Task对象的ContinueWith方法添加&#34;回调&#34;完成任务。 https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.continuewith(v=vs.110).aspx

CompanyAPI comp = repo.GetCompany("LNCR").Result;