通过WCF(C#)与ASP.NET的反馈异步运行进程

时间:2011-09-28 13:10:07

标签: c# asp.net multithreading wcf asynchronous

(环境.NET 4.0 C#WCF和ASP.NET)

所以这就是我想要发生的流程:

  1. 用户访问页面。
  2. 用户通过控件上传文件。
  3. 用户点击“提交”。
  4. Page告诉WCF服务开始“处理”这个文件(很多幕后工作,例如解压缩,散列,移动和数据库工作)
  5. 当文件得到处理时,用户会通过AJAX,更新面板和定时器查看有关处理状态的反馈,每隔N秒检查一次状态。
  6. 我在数据库中添加了一个名为'UploadProcessing'的表,它保存了上传的状态(以及其他内容),我编写了逻辑来处理后端上传,WCF服务调用该上传。在处理上传时,它会上传“UploadProcessing”记录以及当前工作状态,直到最终完成。

    我首先从WCFClient.ProcessUpload(args...);事件中调用Commit_Click()开始,但刚刚处理完上传并等到它完成后再启用AJAX更新状态计时器,该计时器始终显示已经完成(因为它有)。然后我尝试异步调用相同的方法,但它似乎以相同的方式运行,因为页面不会完全回发到客户端(使用启用的计时器),直到异步完成处理程序得到它的响应,实际上导致相同的'完成了“对用户的回复。”

    所以我礼貌而尊重地询问社区你是如何通过WCF解雇并忘记'ProcessUpload()这个方法,这样它可以在后台执行它的事情,而页面可以自由地回发和监控其状态?也许是WCF方面的某种ThreadPool解决方案?或者也许是一个奴隶服务,它监视“UploadProcessing”表以查找待处理的上传,然后以这种方式处理它们?

    提前感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

建议将您的WCF方法设为OneWay操作,例如

[OperationContract(IsOneWay = true)]
public void ProcessUpload(...)
{ 
    //etc
}

答案 1 :(得分:0)

听起来你正在以正确的方式解决它,也许你的WCF服务的异步设置不太正确? this question的答案有一些有用的链接,这是Calling WCF Service Operations Asynchronously上的MSDN页面。

更新:看起来this blog post几乎完全涵盖您的问题,看起来像是一个很好的资源。