我有一個古老的asp.net網站我一直在慢慢地重構使用angularjs。我的一個頁面調用了一個長時間運行的過程,我想讓用戶瞭解進度,並保持活動狀態。在asp.net/angularjs中長時間運行進程的輪詢進度
我想我可以通過使用一些angularjs比如下面的實現:
$scope.setupLongRunningProcess= function() {
$scope.progress = {};
$scope.result = null;
startLongRunningProcess();
$timeout(function() {
pollProgress();
}, 5000);
}
function pollProgress() {
if (!$scope.result) {
$http({
method: "POST",
url: "MyPage.aspx/PollProgressJson",
data: {}
}).then(function successCallback(response) {
$scope.progress.Count = response.data.d;
$timeout(function() {
pollProgress();
}, 5000);
});
}
}
function startLongRunningProcess() {
$http({
method: "POST",
url: "MyPage.aspx/LongRunningProcessJson",
data: {}
}).then(function successCallback(response) {
$scope.result = response.data.d;
});
}
它開始了OK,調用startLongRunningProcess()這就要求MyPage.aspx/LongRunningProcessJson,然後調用pollProgress()作爲預期。但是,它永遠不會到達服務器上的MyPage.aspx/PollProgressJson。在服務器上長時間運行PROCESSS只是一個平常的WebMethod:
<WebMethod>
Public Shared Function LongRunningProcessJson(...) As Result(Of String)
Dim service As LongRunningProcessService = GetService...
Return service.LongRunningProcess(..., HttpContext.Current.Session)
End Function
在這裏,我用的是HTTP會話投放進度計數,所有PollProgressJson正在做的是查詢該。
我不希望我到LongRunningProcessJson原來的呼叫完成,直到它完成,所以我應該做在那裏的異步調用來完成所有的工作(和等待,直到它返回之前完成)?
或者,我採取了完全錯誤的方法? (是的,我知道,我不喜歡傳遞一個會話對象到我的業務層,它確實感到非常噁心)
我也試過使LongRunningProcessJson WebMethod異步,但PollProgressJson不會被調用:
<WebMethod>
Public Shared Async Function LongRunningProcessJson(...) As Threading.Tasks.Task(Of Result(Of String))
Dim service As LongRunningProcessService = GetService...
Return Await Task.Run(Function() service.LongRunningProcess(..., HttpContext.Current.Session))
End Function
$ HTTP已經在生產的異步調用是不是? – monty