2012-05-15 175 views
2

我正在尝试记录对API的请求和响应。我目前正在使用一个可以捕获httpwebresponses和httpwebrequests的delegatingHandler。ContinueWith方法不等待,直到异步任务完成

处理程序:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     LogRequest(request); 
     return base.SendAsync(request, cancellationToken).ContinueWith((task) => 
      { 
       HttpResponseMessage response = task.Result; 
       LogResponse(response); 
       return response; 
      }); 
    } 

LogResponse:

private void LogResponse(HttpResponseMessage response) 
    { 
     ApiResponse info = new ApiResponse(); 
     //Populate response obj 

     if (response.Content != null) 
     { 
      response.Content.ReadAsStringAsync().ContinueWith((task) => 
        { 
         info.Content = task.Result; 
        } 
       ); 
     } 
     _repository.LogResponse(info); 
    } 

我得到一个空例外,当我尝试插入内容到数据库在我的仓库。但是,当我逐步浏览内容对象时,它填充了响应。我想我试图在请求完成之前将数据插入到数据库中。

我不想等待它,因为这会破坏使用异步请求的目的,如何在请求完成时将它挂起来运行logresponse方法?我认为continueWith负责照顾并在任务完成时运行该操作(这是否意味着请求的下载不一定完成?)。

任何想法?

+0

尝试调试打印出的码流。 – SimpleVar

回答

6

您正在设置info.Content与呼叫_repository.LogResponse(info)的呼叫异步。 LogResponse很可能在继续执行之前调用。将您的电话转到LogResponse的延续体内。例如:

if (response.Content != null) 
{ 
    response.Content.ReadAsStringAsync().ContinueWith((task) => 
      { 
       info.Content = task.Result; 
       _repository.LogResponse(info); 
      } 
     ); 
} 
+0

太棒了,有道理。 +1 – gdp

+0

新的异步编程和像这样的错误正在抓住我atm! – gdp

0
if (response.Content != null) 
{ 
    var task = response.Content.ReadAsStringAsync().ContinueWith((task) => 
         { 
          info.Content = task.Result; 
         }); 

    task.Wait(); 
} 

_repository.LogResponse(info); 
+0

这会阻止当前的线程? – gdp

+0

是的。您可以等待它完成,或者在任务结束时登录到仓库中的仓库。关键是代码必须在记录之前彻底运行。 – SimpleVar

0

你可以试试这个例子:

private void LogResponse(HttpResponseMessage response) 
{ 
    ApiResponse info = new ApiResponse(); 
    //Populate response obj 

    if (response.Content != null) 
    { 
     var info = await response.Content.ReadAsStringAsync(); 
     _repository.LogResponse(info); 
    } 
} 
+1

令人怀疑该操作正在使用VS 11 –

+0

这也适用于VS 2010 –

+0

不是很多人可以使用“不支持和使用您自己的风险技术预览” –