我正在使用Amazon SQS進行圖像文件上載。我有檢查新SQS消息的功能,並在循環中讀取消息和運行功能使函數運行異步,使該函數內的異步WCF調用運行不正確
代碼:
if (receiveMessageResponse.ReceiveMessageResult.Message.Count != 0)
{
for (int i = 0; i < receiveMessageResponse.ReceiveMessageResult.Message.Count; i++)
{
string messageBody = receiveMessageResponse.ReceiveMessageResult.Message[i].Body; // read as json text
dynamic dynResult = JObject.Parse(messageBody);
ImageServiceReference.statePackage sp = new ImageServiceReference.statePackage();
..... // some sp objevt initialization
Task.Factory.StartNew(() =>
{
SaveImageProcedure(sp);
});
}
}
在工作代碼,我叫SaveImageProcedure
沒有任務(同步)。但是現在我想讓SaveImageProcedure
異步運行。
在該功能SaveImageProcedure我有一個任務:
var task = Task<int>.Factory.FromAsync(proxy.BeginSaveImage(sp, new AsyncCallback(CompleteSave), state), proxy.EndSaveImage);
這個任務調用WCF服務,使長圖像處理異步。
我的問題:
當我使用Task.Factory.StartNew
異步調用的SaveImageProcedure中,WCF不處理圖像,當我運行它沒有Task.Factory.StartNew
(只是函數名本身)是否運行罰款,我看到圖像處理。
我無法弄清楚爲什麼當我進行更改以運行SaveImageProcedure函數異步時,它導致WCF不能像同步運行一樣工作。
當我用int res = task.Result運行任務時,在任務 .Factory ...代碼之後,它會在繼續執行(在循環中使用)之前等待它完成,因此出於某種原因逐個處理圖像。當我用一個任務中的異步調用包裝函數時,它並行處理圖像。爲什麼會發生?它似乎等待FromAsync完成,然後繼續下一個循環迭代。 –
'task.Result'阻塞,直到任務完成,這就是爲什麼你正在觀察那個行爲。你應該完成task.ContinueWith(t => int res = t.Result)任務完成後調用'ContinueWith'語句,這樣task.Result不會被阻塞。 –