![](/img/trans.png)
[英]Calling multiple methods asynchronously in single method in ASP.NET MVC Controller
[英]Calling a seeding method asynchronously in ASP.net MVC
我希望這個問題不會太廣泛,但是在使用實體框架時我在設計中遇到了一個問題。
基本上,我的公司希望我們的應用程序能夠手動上傳有效的數據庫並隨意植入它們,而不必運行更新數據庫。 通過簡單地將種子方法移出配置文件並重載構造函數以從上載的路徑接受數據庫,我使此方面足夠容易地工作。
但是,下一個要求我完成的任務使我遇到了一些設計問題。 他們希望我通過進度條/文本輸出在客戶端提供此播種發生的指示器,以及播種的距離。 由於播種方法是同步運行的,因此這被證明很麻煩,因為客戶端將在運行期間被鎖定。
由於播種方法大約需要20分鍾才能完成,因此這不是理想選擇,因為客戶端無法確定他們必須等待多長時間才能再次執行某項操作。 我嘗試使用異步控制器來實現它,但是它抱怨種子方法的類型無效。 在文件上傳中調用的actionresult看起來像這樣
[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
string date = DateTime.Now.ToString("MM-dd-yyyy-HHmm-");
fileName = date + fileName;
var path = Path.Combine(Server.MapPath("~/bin/SampleData"), fileName);
file.SaveAs(path);
//create config instance and seed path
Reseed reseed = new Reseed(fileName);
reseed.Seed(db);
GetTimeStamp(DateTime.Now);
}
return RedirectToAction("Index");
}
有誰知道以一種可以異步運行的方式來設計它的好方法嗎?
在服務器上以異步方式進行播種只會在進程持續時間內釋放線程(如果綁定了IO),為了返回該線程,您將最終等待它完成(如果要使控制器成為該線程)異步)。 它也不適合並行化,因為它也不是計算綁定操作。
無論哪種方式,您都希望將進度反饋給客戶端,因此有幾種方法和技術值得考慮:
Web套接字,使用SignalR,您可以從服務器到客戶端建立連接,並將連接上的內容推送到客戶端。 這會降級為軟件不支持的長時間輪詢。 由於其雙向性,可能有點過大。
服務器發送事件,其開銷比Web套接字少,並且從服務器到客戶端是半雙工的,它還允許將內容從服務器推到客戶端
稍微不同的方法是從屏幕返回/重定向並向用戶發送電子郵件,指示該過程何時完成。 您可以啟動排定的任務,或將命令發送到進程外的某個項以啟動批處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.