2016-02-14 73 views
0

我已经创建了一个新的winforms应用程序。我正在尝试创建一个侦听存储队列中的消息的类。以Win表单参与Azure工作者角色后台服务

using System; 
using Microsoft.WindowsAzure.Storage; 
using Microsoft.WindowsAzure.Storage.Queue; 
using System.Threading; 
using Microsoft.WindowsAzure.ServiceRuntime; 
using System.Configuration; 

namespace PMonitor 
{ 
     public class QueueWorker : RoleEntryPoint 
    { 

     public override void Run() 
     { 
       CloudQueue queue = clnt.GetQueueReference("stuff"); 

     while (true) 
     { 
      CloudQueueMessage qMessage = null; 

      do 
      { 
       qMessage = queue.GetMessage(TimeSpan.FromSeconds(10)); 
       if (qMessage != null) 
       { 
        //handle message 
       } 
      } 
      while (qMessage != null); 


      Thread.Sleep(10000);  
      } 
     } 

     public override bool OnStart() 
     { 

      return base.OnStart(); 
     } 

    } 

} 

我如何让工作人员开始在窗体中运行并运行,并在队列中找到消息时告诉我?

当前实例化这个类并在Form Load中调用Run()会锁定表单。

这样做的模式是什么?

+0

我很想知道为什么要在WinForm应用程序中使用工作者角色。你介意描述你的用例吗? –

+0

我想要做的就是当这段代码在队列中看到一条消息时处理消息。如果我在表单加载中调用这个类,它将锁定表单。我必须使用异步模式来获取消息,以便表单不锁定? – nlstack01

回答

1

我怀疑工人角色有一个基本的误解。这些不是您像班级那样实例化的服务。相反,这些是在Azure中运行的无状态虚拟机的定义。您发布的代码片段是在启动辅助角色实例(VM)后运行的框架代码,其中包含在Run()方法中运行的代码(例如队列消耗)。

WinForms应用程序不需要RoleEntryPoint类,因为它们专门用于在Azure中运行的无状态VM内。

队列处理(或任何其他您可能需要运行的任务)与工作角色没有关系;您的应用程序可以通过使用存储SDK(或通过直接调用REST API)来使用队列消息。您如何/在哪里设置队列处理逻辑完全取决于您。

注意:您当然可以在您的WinForms应用程序中调用在工作角色实例中运行的服务,但我不认为这就是您要求的。

StackOverflow中有几个关于工作者角色的更详细的答案,比如this one

+0

我想要做的就是当这段代码在队列中看到一条消息时处理消息。如果我在表单加载中调用这个类,它将锁定表单。我必须使用异步模式来获取消息,以便表单不锁定? – nlstack01

+0

我不认为你理解我的解释。您无法在桌面应用程序中使用本地尝试使用的代码。无论您是否使用异步,您都无法从表单加载中调用该类。 –

相关问题