在继续执行之前,使多线程客户端方法等待WCF服务完成

时间:2011-01-28 21:49:44

标签: c# .net multithreading wcf web-services

修改 请注意,当我在调试模式下使用客户端解决方案时,一切都按预期工作。具有该服务的解决方案在调试模式中运行良好。


我正在处理一个文件上传器,它将用户上传的.zip文件保存到服务器,解压缩,从那里异步复制到一堆不同的位置(使用Web服务),然后删除上传的。 zip文件和解压缩文件。

所以:

1)上传并解压缩文件

2)使用 QueueUserWorkItem(MethodName)并将用户重定向到“谢谢”页面

3) MethodName()然后进行一些WCF Web服务调用,将解压缩的文件夹复制到其他位置。

string copyToPaths = UploaderService.StartFolderUpload(_fileCategoryName, topDir);
UploaderService.CompleteFolderUpload(copyToPaths);

4)一旦服务电话完成并且不再需要文件,删除旧文件(在此处发布

所以我的问题是调用WCF服务的方法在说完完成并删除文件之前不会等待服务调用完成。它删除上传的文件,然后Web服务显然无法使用这些文件复制到其他位置。

如何创建一个方法(使用 QueueUserWorkItem 调用)等待Web服务调用完成后继续执行?

2 个答案:

答案 0 :(得分:1)

据我所知,这种行为与客户端无关。它由服务方法上的OperationContract属性控制。

[OperationContract(IsOneWay = true)]
void CompleteFolderUpload(string copyToPaths);

这是第二种服务方法的样子吗?如果是,则如果希望客户端等待此方法完成,则必须将IsOneWay设置为false(或者仅删除它)。 IsOneWay = true意味着客户端不应该期望服务器的响应,因此它们几乎总是在方法完成之前返回。

答案 1 :(得分:0)

您可能需要考虑将您的WCF服务设为Duplex service。这样,您可以在客户端上指定回调,以便了解服务何时完成。您也可以将数据传回客户端,例如错误信息等