这样做的正确方法是使用基于队列的通信。原因是可扩展性。您希望服务的“实例”接收请求,并且希望“实例”将结果返回给客户端,对吗?
您可以快速浏览一下我的一篇关于 AppFabric Queues 的博客文章,但它们对于这个来说太庞大了。这是我的做法:
创建一个 WorkerRequest 类,看起来像这样
public class WorkerRequest {
string clientId;
MyTaskEnum taskToPerform;
}
写入队列存储,(在我的生产代码中,我使用了一个包装器,我还没有写过博客,但计划这样做:)),添加请求。
让一个工作线程监听这个队列,当收到请求时,产生一个新线程来完成它。完成后,将您的任务和客户端 ID 作为密钥写入 表存储。这样您就可以随时检查状态(对表的简单 /GET/ 请求)+ 您已经解决了解耦和可扩展性问题。
希望对你有帮助。
更新:想再解释一下,所以我决定更新帖子=)
您可以在“Web 角色”中创建 WCF Web 服务,这就是我会做的。我刚才blogged about它。在同一角色中,您创建了一个 Worker。你可以通过一个实现RoleEntryPoint 的类来做到这一点。此类(位于 Microsoft.WindowsAzure.ServiceRuntime 中)如下所示:
public abstract class RoleEntryPoint
{
public virtual bool OnStart()
{
return true;
}
public virtual void Run()
{
Thread.Sleep(-1);
}
public virtual void OnStop()
{
}
}
您只需在 Run 中实现一个 while(true) 循环,它会询问队列是否有任何新消息要处理。当收到这样的消息时不要产生新的,只需处理它。如果要扩展它,可以通过添加新实例进行扩展。现在显然,这可能会很昂贵,因此实际上生成一个新线程是明智的,但仅限于某个限制,例如最多 5 个线程。如果您的池中没有线程,则将消息返回到队列(您需要在完成消息后调用Complete(),否则它不一定会被删除)。它稍后会被拾起,或者由其他工人拾起。
所以,当工作线程完成时,将结果写入表存储就完成了。