2014-02-27 64 views
0

我正在使用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不能像同步運行一樣工作。

回答

1

SaveImageProcedure已經是異步的,因爲Task<int>.Factory.FromAsync是異步的。你爲什麼需要圍繞它的Task.Factory.StartNew?這將使用額外的線程,並且一旦用完了線程池中的所有線程,程序將變得非常緩慢,因爲使用非常緩慢的爬坡算法增加了線程池大小。我會很好奇在程序運行時看看你程序中的線程數。

+0

當我用int res = task.Result運行任務時,在任務 .Factory ...代碼之後,它會在繼續執行(在循環中使用)之前等待它完成,因此出於某種原因逐個處理圖像。當我用一個任務中的異步調用包裝函數時,它並行處理圖像。爲什麼會發生?它似乎等待FromAsync完成,然後繼續下一個循環迭代。 –

+0

'task.Result'阻塞,直到任務完成,這就是爲什麼你正在觀察那個行爲。你應該完成task.ContinueWith(t => int res = t.Result)任務完成後調用'ContinueWith'語句,這樣task.Result不會被阻塞。 –