2012-02-07 42 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 

工程就像一个魅力!