2012-02-07 37 views
0

我有一個控件可以將1..n個文件分塊上傳到我的WCF服務。分塊和重組是通過對WCF服務的多次調用完成的,對於1個文件來說都是很好的。如何阻止Silverlight,直到進行一系列異步WCF調用?

但是,當我有超過1個文件,我遇到了一些問題。包含每個文件的數據的外部循環在第一個文件完成上傳之前繼續。事實上,如果需要10次調用通過WCF調用將文件分塊到服務器,則處理將在第一次調用WCF之後返回,因爲它是異步的,不會阻塞。整個過程由上傳按鈕點擊啓動,所以我認爲這是在UI線程上完成的。我曾嘗試使用'AutoResetEvent'但無濟於事;它總是凍結。

我需要的是外循環停止處理,直到1..n異步調用(通過ProcessFile方法)內的WCF完成並且整個單個文件已被上傳。下面的代碼:

'FileUploadData is an Observable collection of IO.FileInfo objects 
For Each FileItem In FileUploadData 
    'Method internally calls WCF asynchronously and does so continually until file is completely uploaded. 
    ProcessFile(FileItem) 
    'NEED TO STOP HERE until file passed in above is complete. 
    'Currently processing continues on because 1st call to WCF is async and processing is returned to here. 
Next 

我不一定要找這裏syncronous解決方案,但我需要一些方法,讓這些文件既可以在他們自己線程上傳或「ProcessFile」方法1日完全上傳(仍然調用WCF異步),然後繼續外循環到上面顯示的下一個文件。

關於如何解決這個問題的任何想法?謝謝!

+1

在繼續之前,您需要等待上傳發送完成的事件。這意味着將算法從循環改變爲不同的東西。 – ChrisF 2012-02-07 15:42:29

回答

0

好了,發現這個問題的速度幾乎和發佈這個問題一樣快(當發生這種情況時很棒)。這篇文章(http://www.informit.com/articles/article.aspx?p=1759240)幫助我想到了一種與我已經使用的基本方法略有不同的方式來評價這一點。

我現在使用LINQ查詢來從集合中一次只處理1個文件,而不是一個循環來持續處理所有這些文件。一旦文件完成加載,我將它從集合中刪除,然後引發我在ProcessFile方法的結束處聲明的事件。引發事件處理程序方法,並選擇要在集合中處理的下一個文件,並重復此操作直至完成。

Dim NextUpload = (From f In FileUploadData 
       Select f).FirstOrDefault 

If NextUpload IsNot Nothing Then 
    ProcessFile(NextUpload) 
End If 

工程就像一個魅力!