2013-01-24 34 views
0

示例代碼Azure Worker角色異步接收消息:我應該睡多久? (毫秒)這裏

public override void Run() 
{ 
    while (true) 
    { 
    IAsyncResult result = CUDClient.BeginReceive(TimeSpan.FromSeconds(10), OnMessageReceive, CUDClient); 
    Thread.Sleep(10000); 
    } 
} 

我已經測試了這個Azure的輔助角色。我在服務總線隊列中保留了100條消息。它將實體更新作爲操作(實體框架)。處理所有隊列需要15分鐘,看起來花費的時間更長。任何改善這個問題的建議?

在此先感謝

回答

0

試試這個...

//Somefunction 
    IAsyncResult result = CUDClient.BeginReceive(OnMessageReceive, CUDClient); 

    while (true) 
     Thread.Sleep(1000); //In case you are using thread 

    //Somefunction End 

public static void OnMessageReceive(IAsyncResult result) 
    { 
     CUDClient.BeginReceive(OnMessageReceive, CUDClient); 
     SubscriptionClient queueClient = (SubscriptionClient)result.AsyncState; 
     IBusinessLogicProvider Obj; 
     try 
     { 
      //Receive the message with the EndReceive call 
      BrokeredMessage receivedmsg = queueClient.EndReceive(result); 
       //receivedmsg = CUDClient.Receive(); 
       if (receivedmsg != null) 
       { 
        switch (receivedmsg.ContentType) 
        { 
         case "Project": 
          Obj = new ProjectsBL(); 
          Obj.HandleMessage(receivedmsg); 
          receivedmsg.BeginComplete(OnMessageComplete, receivedmsg); 
          break; 
        } 
       } 
      } 
    } 
+0

IAsyncResult result = CUDClient.BeginReceive(OnMessageReceive,CUDClient); while(true){};執行100msgs到30秒。它是我所有嘗試中速度最快的。但是有一個問題會影響CPU性能? – sivaL

+0

以獲得更好的CPU性能,請使用TimeSpan.MaxValue嘗試Thread.Sleep。 – NavaRajan

+0

不可以。它應該是Thread.Sleep(Timeout.Infinite);如果我們像這樣離開While(true){},CPU百分比爲99%。執行此While(true){Thread.Sleep(Timeout.Infinite);}後。 CPU百分比下降到1%。 – sivaL

1

其實服務總線是非常快,以我的經驗。你有什麼錯是「Thread.Sleep(10000)」;

每個消息睡10秒。 對於100個消息100 * 10 =萬秒=16.67分鐘 因此,這是用於延遲一個問題...

解決方案:

不使用Thread.sleep代碼(10000); (它不適合BeginReceive,只適合用於接收)

public override void Run() //This should not be a Thread...If its a thread then your thread will terminate after receiving your first message 
{ 
    IAsyncResult result = CUDClient.BeginReceive(**TimeSpan.MaxValue**, OnMessageReceive, CUDClient); 
} 

//Function OnMessageReceive 
{ 
//Process the Message 
**IAsyncResult result = CUDClient.BeginReceive(TimeSpan.MaxValue, OnMessageReceive, CUDClient);** 
} 

使用的SB TimeSpan.MaxValue您的連接將被保留用於長期。所以沒有頻繁的空消息(成本較低)...

+0

感謝NavaRajan,我找到了TimeSpan.MaxLimit。所以使用了TimeSpan.MaxValue。它需要更長的時間。我需要使用 - while(true) {} – sivaL

+0

無限循環是不需要的...一旦你得到回調(即接收到的消息),你將開始在回調本身..因此,你將不斷收聽SB結束...如果你不能理解它,我會更好地解釋你... – NavaRajan

+0

我試着按照你的建議。我在隊列中放置了10條消息,耗時7分30秒。它太慢了。 – sivaL

0

我試過這個。

while (true) 
     { 
      //read all topic messages in sequential way....   
      IAsyncResult result = CUDClient.BeginReceive(OnMessageReceive, CUDClient); 
      Thread.Sleep(1000); 
     } 
public static void OnMessageReceive(IAsyncResult result) 
    { 
     SubscriptionClient queueClient = (SubscriptionClient)result.AsyncState; 
     IBusinessLogicProvider Obj; 
     try 
     { 
      //Receive the message with the EndReceive call 
      BrokeredMessage receivedmsg = queueClient.EndReceive(result); 
       //receivedmsg = CUDClient.Receive(); 
       if (receivedmsg != null) 
       { 
        switch (receivedmsg.ContentType) 
        { 
         case "Project": 
          Obj = new ProjectsBL(); 
          Obj.HandleMessage(receivedmsg); 
          receivedmsg.BeginComplete(OnMessageComplete, receivedmsg); 
          break; 
        } 
       } 
      } 
    } 

它在1分鐘內(00:01:02)處理了所有100條消息。比以前好很多。

+0

請把OnMessageReceive Code ...我認爲你對線程有不好的假設... – NavaRajan

+0

我更新了OnMessageRececeive方法代碼。我試着用這個方法的不同線程來實現TimeSpan.MaxValue。性能沒有提高。如果你覺得它不是正確的做法。請在不同的答案中發佈上述工作代碼。 – sivaL

1

嘗試使用XecMe並行任務處理消息的閱讀。

XecMe @ xecme.codeplex.com