c# - Async/Await 和 Task<T> 不返回数据

标签 c# .net async-await task-t

当我这样做时,它不会返回 Task<TokenModel>我的意思是这条线卡住了tokenModel = await response.Content.ReadAsAsync<TokenModel>();

Foo()
{
   var r = IsLoginOk();
}
public async Task<TokenModel> IsLoginOk()
{

  var handler = new HttpClientHandler();
  handler.UseDefaultCredentials = true;
  handler.PreAuthenticate = true;
  handler.ClientCertificateOptions = ClientCertificateOption.Automatic;

  client = new HttpClient(handler);
  client.BaseAddress = new Uri(Properties.Settings.Default.WebApiUrl);
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));                

  var apiAccountLogin = apiManager.ApiAccountLogin(Properties.Settings.Default.WebApiPassword, Properties.Settings.Default.WebApiUsername);

  var response = await  client.PostAsJsonAsync(apiAccountLogin.Url, apiAccountLogin.Container);

  response.EnsureSuccessStatusCode();  
  tokenModel = await response.Content.ReadAsAsync<TokenModel>();

  return tokenModel;
}

但如果我使用 void然后它工作正常

Foo()
{
     IsLoginOk();
}
public async void IsLoginOk()
{

  var handler = new HttpClientHandler();
  handler.UseDefaultCredentials = true;
  handler.PreAuthenticate = true;
  handler.ClientCertificateOptions = ClientCertificateOption.Automatic;

  client = new HttpClient(handler);
  client.BaseAddress = new Uri(Properties.Settings.Default.WebApiUrl);
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));                

  var apiAccountLogin = apiManager.ApiAccountLogin(Properties.Settings.Default.WebApiPassword, Properties.Settings.Default.WebApiUsername);

  var response = await  client.PostAsJsonAsync(apiAccountLogin.Url, apiAccountLogin.Container);

  response.EnsureSuccessStatusCode();  
  tokenModel = await response.Content.ReadAsAsync<TokenModel>();   
}

如我所见,我的代码类似于 Microsift 示例代码 http://msdn.microsoft.com/en-us/library/hh191443.aspx .

这是某种僵局吗?

我需要返回tokenModel。我该怎么做? 谢谢!

最佳答案

像这样改变你的构造函数:

private Foo()
{
    // Do only synchronous initialization here
}

public static async Task<Foo> CreateAsync()
{
    var foo = new Foo();
    await foo.IsLoginOk();
    return foo;
}

您的调用方需要相应地更改。

关于c# - Async/Await 和 Task<T> 不返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27984044/

相关文章:

c# - 动态设置 DataGridColumn 的单元格内容

C#: "Cannot create an instance of the static class"

c# - 动态生成的 MSIL 中奇怪的 DateTime ToString 行为

c# - 如果有条件地执行任务,异步方法应该做什么?

c# - 如果方法是同步的,则保留 Task 和 Task.FromResult 还是完全删除 Task-stuff?

c# - Entity Framework - 表达式与函数

c# - 为什么在方法结束时返回是一个好习惯

c# - 从 C# 在 Windows 桌面电子邮件客户端中打开新电子邮件窗口

c# - 重温 Task.ConfigureAwait(continueOnCapturedContext : false)

c# - 在类初始值设定项中使用隐式类型数组