2016-02-14 109 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

我不認爲你理解我的解釋。您無法在桌面應用程序中使用本地嘗試使用的代碼。無論您是否使用異步,您都無法從表單加載中調用該類。 –

相關問題