<div>Hi,</div>
<div>��</div>
<div>I like the Consumer pattern, but I wanted a timed version of it.� FYI: the Consumer pattern is basically a message enumerator/iterator that you can use in a foreach statement.� i.e. when a message turns up, you get another pass through the loop during which your code can decide what to do with the message.� Consumer lives in the <font size="2" face="Consolas"><font size="2" face="Consolas">RabbitMQ.Client.MessagePatterns namespace.</font></font></div>

<div>��</div>
<div>For me, Foreach is neat approach as It hides uneccessesary detail.</div>
<div>�</div>
<div>
<div>I finally managed to dig into some of the RabbitMQ source code.� Is source code better than documentation?� Maybe.��</div></div>
<div>�</div>
<div>Anyway, the functionality I wanted was always there.� How did I miss that?� There&#39;s a version of the Next function that has a parameter for a timed wait.</div>
<div>�</div>
<div>So, instead of:</div>
<div><font size="2" face="Consolas"><font size="2" face="Consolas">
<p></p></font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">using<font size="2" face="Consolas"><font color="#000000" size="2" face="Consolas">(</font></font><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas">Subscription</font></font></font><font size="2" face="Consolas"><font color="#000000" size="2" face="Consolas"> sub=</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">new</font></font></font><font size="2" face="Consolas"><font color="#000000" size="2" face="Consolas"> </font></font><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas">Subscription</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"><font color="#000000">(ch,QueueNme)) {</font></font></font><br>
� foreach</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">(</font></font><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas">BasicDeliverEventArgs</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> ev </font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">in</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> sub) {<br>
� � DoRQMessage(ev.Body);<br></font></font><font color="#008000" size="2" face="Consolas"><font color="#008000" size="2" face="Consolas"><font color="#008000" size="2" face="Consolas">� � // do work here<br></font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">� � ch.BasicAck(ev.DeliveryTag,</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">true</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">);<br>
� }<br>� sub.Ack();<br>}</font></font>
<p>Use this instead...</p></div>
<div><font size="2" face="Consolas"><font size="2" face="Consolas">
<p></p></font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">using</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">(</font></font><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas">Subscription</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> sub=</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">new</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> </font></font><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas">Subscription</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">(ch,QueueNme)) {<br>
</font></font><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas">� BasicDeliverEventArgs</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> message;<br>
</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">��while</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">(</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">true</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">) {<br>
��� sub.Next(5000,</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">out</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> message); // wait�up to 5 seconds<br>
� � </font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">if</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">(message==</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">null</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">) {<br>
����� // logic to deal with the timeout������<br></font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">����� break; // kill the loop if�that&#39;s what you want</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"><br>
��� }<br></font></font><font color="#008000" size="2" face="Consolas"><font color="#008000" size="2" face="Consolas"><font color="#008000" size="2" face="Consolas">� � // do work here<br></font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">� � ch.BasicAck(message.DeliveryTag,</font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">true</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">);<br>
</font></font><font size="2" face="Consolas"><font size="2" face="Consolas">� }<br>}</font></font>
<p><font size="2" face="Consolas"><font size="2" face="Consolas">Note: behind the scenes foreach uses <font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas"><font color="#2b91af" size="2" face="Consolas">IEnumerator</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas">.MoveNext(), which being parameterless, in turn�calls the Next() function, not the timed�version above &quot;sub.Next(5000,<font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">out</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> message); &quot;</font></font>.� There&#39;s nothing stopping us putting in a simple if branch that accessess module level variables set by a constructor for a slightly neater approach.</font></font></font></font></p>

<p>So what is the policy on updating the Mercurial repository?� If I get a spare chance, and this is desirable,�I&#39;ll alter Subscribe with an additional constructor that has a timer argument.� Then those of us that care can continue to use the foreach statement.</p>
</div>
<div>e.g. <font face="Consolas"><font color="#0000ff">using</font><font size="2"><font size="2">(</font></font><font color="#2b91af" size="2"><font color="#2b91af" size="2"><font color="#2b91af" size="2">Subscription</font></font></font><font size="2"><font size="2"> sub=</font></font><font color="#0000ff" size="2"><font color="#0000ff" size="2"><font color="#0000ff" size="2">new</font></font></font><font size="2"><font size="2"> </font></font><font color="#2b91af" size="2"><font color="#2b91af" size="2"><font color="#2b91af" size="2">Subscription</font></font></font><font size="2"><font size="2">(ch,QueueNme,5000))� ... foreach(<font color="#2b91af">BasicDeliverEventArgs</font><font size="2" face="Consolas"><font size="2" face="Consolas"> ev </font></font><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas"><font color="#0000ff" size="2" face="Consolas">in</font></font></font><font size="2" face="Consolas"><font size="2" face="Consolas"> sub)</font></font></font></font></font></div>

<div>�</div>
<div>Does anyone like this change?� There&#39;s not a big difference between doing a foreach and a while.� Just a tiny bit neater IMO.</div>
<div>�</div>
<div>cheers,</div>
<div>-Steven</div>
<div>�</div>
<div>�</div>
<div>�</div>
<div>�</div>
<div>�</div>
<div>�</div>
<div>�</div>