簡體   English   中英

如何進行異步調用不會阻止操作返回對用戶的響應

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM