如何在不等待httpclient的情况下发帖?

时间:2015-03-30 14:19:06

标签: httpclient

我正在使用HttpClient将数据发布到webapi应用程序。

此代码有效(web api收到post调用),但代码正在等待响应。

public static async void Notify(List<string> txs,string url) 
{
    using (HttpClient client = new HttpClient() )
    {
        string resourceAddress = url; 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        await client.PostAsJsonAsync(resourceAddress, txs);
    }
}

这个没有等待来自网络API的响应,但网络API没有接到任何邮件:

public static void Notify(List<string> txs,string url) 
{
    using (HttpClient client = new HttpClient() )
    {
        string resourceAddress = url; 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.PostAsJsonAsync(resourceAddress, txs);
    }
}

我需要调用web api并继续执行代码而无需等待。 我如何使用HttpClient做到这一点? 我想要完成执行的方法(不包括其他工作)

2 个答案:

答案 0 :(得分:2)

  

我需要调用web api并继续执行代码   等候。我如何使用HttpClient做到这一点?

当您调用Notify时,它应该返回 System.Threading.Task ,此任务是管理Notify方法执行的包装器,反过来 PostAsJsonAsync < / em>方法。

public static async Task Notify(List<string> txs,string url) 
{
    using (HttpClient client = new HttpClient() )
    {
        string resourceAddress = url; 
        client.DefaultRequestHeaders.Accept.Add(
           new MediaTypeWithQualityHeaderValue("application/json"));
        return client.PostAsJsonAsync(resourceAddress, txs);
    }
}

您可能正在通过await调用Notify。这将暂停在调用位置调用Notify的方法(并且调用方法将继续)。如果您没有等待,您可以执行其他代码,然后在完成此操作后,您可以等待来自Notify的任务并等待Post完成。除非额外的工作比post任务本身更长,否则你需要等待帖子在某个点完成。 e.g

  var task = Notify(someList, someUrl);

  // do a long running task / extra work here, 
  // we have not awaited Notify therefore this will execute whilst the post 
  // is running

  await task;
  // at this point the we have waited for the Notify method to complete, 
  // this will block for the time the post has left to complete (if any at all)

await 告诉您的方法此时暂停执行并等待任务完成。但是如果有一个调用方法,则调用方法在等待时继续。如果调用方法也等待,则等待任务完成,然后调用堆栈的下一个方法继续,依此类推,直到我们离开代码堆栈并最终进入某种非阻塞层等待代码完成(例如Async ASP.NET MVC或Async Winforms UI)。或者我们有一个明确的阻止Task.Wait调用。

答案 1 :(得分:0)

如果有人还在寻找答案,

public void NotifyAsyncWrapper(IEnumerable<string> txs, string url)
{
    Notify(txs, url).ContinueWith(ContinuationAction, TaskContinuationOptions.OnlyOnFaulted);
}

public async Task Notify(IEnumerable<string> txs, string url)
{
    //async await code
}

private void ContinuationAction(Task task)
{
    if (task.Exception != null)
    {
        logger.LogError(ex, ex.Message);
    }
}