我正在使用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做到这一点? 我想要完成执行的方法(不包括其他工作)
答案 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);
}
}