所以我想使用HTTP 202代碼創建理念,爲服務器端非同步的證明(服務器接受任務後,立即返回終點輪詢,然後創建/更新資源)我如何產生一個將完成並立即返回給客戶端的任務?
的Rick Strahl has a description如何在普通的ASP.NET中做到這一點。該技術取決於能夠Response.End,然後繼續執行代碼。 Response對象甚至似乎在Web API控制器的上下文中不可用。
如果以下工作按計劃進行,它不會阻止返回http 202並仍然保證數據庫任務將運行完成。
//Insert or Update Asych.
public Task<HttpResponseMessage> Post(bool asynch, [FromBody]DatedValue value) //Insert Value
{
Guid key = Guid.NewGuid();
//Want this to run to completion, even if response associated with parent thread is done.
Task toWait = Task.Factory.StartNew(() =>
{
queue.Add(key, 0);
DatedValue justCreated = Insert(value);
queue[key] = justCreated.Id;
});
//Return address to resource just created.
Task<HttpResponseMessage> sender = Task.Factory.StartNew(() =>
{
HttpResponseMessage message = Request.CreateResponse(HttpStatusCode.Accepted);
message.Headers.Location = new Uri("/ValueQueue/" + key);
return message;
});
Task.WaitAll((new[] { toWait, sender }));
return sender;
}
你的問題是什麼?爲我測試?寫另一個? – 2014-09-29 22:18:50
如何生成一個將完成並立即返回(響應)到客戶端的任務?英文模式的簡短描述應該沒問題。我實際上並不信任多線程代碼的測試,但nunit主機不像ASP.NET主機。 – MatthewMartin 2014-09-30 00:20:06
你的代碼不會實現你的目標。你在'Task.WaitAll'上阻塞,所以你的方法不能完成,直到*任務完成。你真正想要的東西是你的「之後」邏輯的一個難忘的(未被察覺的)任務,但是ASP.NET如何對待即忘即滅的任務,以及它是否會保證它們將運行完成即使在發佈響應之後 - 我不知道(更不用說這聽起來像是一個非常糟糕的主意)。 – 2014-09-30 03:43:18