与任务,异步,等待,与SendRequestAsync的示例的误解

时间:2014-05-22 09:45:19

标签: c# asynchronous task-parallel-library task async-await

如果我称这种方法(1.)没有任何反应,我不知道为什么。 如果我只是调用model.TestConnection(null);没有结果我点击了断点1,但后来我不等待结果。

所以,为什么没有'当我调用model.TestConnection(null)时,我点击任何断点.Result? 当我刚调用model.TestConnection(null);?

时,我为什么要点击它们

方法GetUrl调用SendRequestAsync并等待结果,然后返回其内容。 这一切都是作为一项任务发生的,因此您可以等待GetUrl获取内容。但是我的方面似乎对任务并行库(TPL)存在很大的误解。

  1. var result = model.TestConnection(null).Result;
    
  2. public class CcuMockModel : CcuModelBase, ICcuModel
    {
        public Task<CheckLoginResult> TestConnection(string url)
        {
           return GetUrl(@"http://localhost:8080/api/getObjects");
        }
    }
    
  3. public class CcuModelBase
    {
        public async Task<CheckLoginResult> GetUrl(string url)
        {
            var aHBPF = new HttpBaseProtocolFilter();
            aHBPF.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired);
            aHBPF.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
    
            var client = new HttpClient(aHBPF);
    
            var request = new HttpRequestMessage(HttpMethod.Get, new Uri(url));
    
            HttpResponseMessage response;
            try
            {
                response = await client.SendRequestAsync(request);
                // Breakpoint 1
                return new CheckLoginResult()
                {
                    Content = response.Content.ToString(),
                    Status = CheckLoginResult.ErrorCode.Ok
                };
            }
            catch (Exception ex)
            {
            }
            // Breakpoint 2
            return new CheckLoginResult() {Status = CheckLoginResult.ErrorCode.Failed};
        }
    }
    

1 个答案:

答案 0 :(得分:1)

Thx Lee for the Link http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html 这令人兴奋,并帮助我理解任务,异步和等待。

我用

阻止了我的任务
var result = model.TestConnection(null).Result;

现在我等待,一切正常。

private async static void Testing()
{
    var result = await model.TestConnection(null);
}