[英]How to make an async call not prevent action from returning response to user
我有以下異步代碼
public async static void SendAsync(string url)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = false;
request.Timeout = 5000;
var response = await request.GetResponseAsync().ConfigureAwait(false);
response.Close();
}
catch (Exception ex)
{
SendException(ex, url);
}
}
這是由控制器動作調用的。
public ActionResult Details(string id)
{
// DO something
SendAsync(some-valid-url);
// Do something
return View();
}
當我調試它 - 它運行異步和命中
return View();
並且在它出現之前退出
response.Close();
但是在提琴手中,你可以看到瀏覽器沒有發送http響應,它等待SendAsync功能完成處理,這不是我想要的。 我希望http響應立即返回給用戶。
為了達到這個目的,我有什么需要改變的?
我實際上編輯了它,現在正在執行async static void,因為我不需要跟蹤任務的結束,
但是你確實需要跟蹤,因為MVC將在Details
返回時關閉連接,你需要告訴MVC你正在等待后台操作。
public async Task<ActionResult> DetailsAsync(string id)
{
// DO something
var sendTask = SendAsync(some-valid-url);
// Do something else that does not depend on sendTask
await sendTask;
return View();
}
回答您的最新評論
進行等待將使其等待異步http調用完成。 我不想要的。
要獲得您正在尋找的行為,您需要使用AJAX ,async / await系統不會為您提供您想要的東西。 (我從來沒有真正使用AJAX完成MVC所以我沒有給你一個例子如何做到這一點)
進行等待將使其等待異步http調用完成。 我不想要的。
這聽起來像你想要fire and forget
因為你不想等待響應。
要記住一些負面因素(例如沒有錯誤處理,沒有保證等),所以我建議在將其放入項目之前先閱讀一下。
在我看來,這是用fire and forget
方法的最簡單方法。
ThreadPool.QueueUserWorkItem(o => SendAsync(some-valid-url));
這將從應用程序池中請求可用的線程。 然后,它將使用該線程執行該方法,而不會阻止當前正在運行的方法。
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.