# HG changeset patch # User Steven Robbins # Date 1268488414 0 # Branch messenger # Node ID 9aea0843b34b1329c258f6b3803ee82f1b715c12 # Parent 2c5f5e48d084b1bbfab25d663374abc6f5dc68f8 Added PublishAsync methods diff -r 2c5f5e48d084b1bbfab25d663374abc6f5dc68f8 -r 9aea0843b34b1329c258f6b3803ee82f1b715c12 TinyIoC.Tests/TinyMessengerTests.cs --- a/TinyIoC.Tests/TinyMessengerTests.cs Sat Mar 13 12:33:13 2010 +0000 +++ b/TinyIoC.Tests/TinyMessengerTests.cs Sat Mar 13 13:53:34 2010 +0000 @@ -5,6 +5,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using TinyIoC.Tests.TestData; using TinyMessenger; +using System.Threading; namespace TinyIoC.Tests { @@ -302,7 +303,83 @@ { var messenger = UtilityMethods.GetMessenger(); messenger.Subscribe>((m) => { throw new NotImplementedException(); }); + messenger.Publish(new GenericTinyMessage(this, "Testing")); } + + [TestMethod] + public void PublishAsync_NoCallback_DoesNotThrow() + { + var messenger = UtilityMethods.GetMessenger(); + + messenger.PublishAsync(new TestMessage(this)); + } + + [TestMethod] + public void PublishAsync_NoCallback_PublishesMessage() + { + var messenger = UtilityMethods.GetMessenger(); + bool received = false; + messenger.Subscribe((m) => { received = true; }); + + messenger.PublishAsync(new TestMessage(this)); + + // Horrible wait loop! + int waitCount = 0; + while (!received && waitCount < 100) + { + Thread.Sleep(10); + waitCount++; + } + Assert.IsTrue(received); + } + + [TestMethod] + public void PublishAsync_Callback_DoesNotThrow() + { + var messenger = UtilityMethods.GetMessenger(); + + messenger.PublishAsync(new TestMessage(this), (r) => {string test = "Testing";}); + } + + [TestMethod] + public void PublishAsync_Callback_PublishesMessage() + { + var messenger = UtilityMethods.GetMessenger(); + bool received = false; + messenger.Subscribe((m) => { received = true; }); + + messenger.PublishAsync(new TestMessage(this), (r) => { string test = "Testing"; }); + + // Horrible wait loop! + int waitCount = 0; + while (!received && waitCount < 100) + { + Thread.Sleep(10); + waitCount++; + } + Assert.IsTrue(received); + } + + [TestMethod] + public void PublishAsync_Callback_CallsCallback() + { + var messenger = UtilityMethods.GetMessenger(); + bool received = false; + bool callbackReceived = false; + messenger.Subscribe((m) => { received = true; }); + + messenger.PublishAsync(new TestMessage(this), (r) => { callbackReceived = true; }); + + // Horrible wait loop! + int waitCount = 0; + while (!callbackReceived && waitCount < 100) + { + Thread.Sleep(10); + waitCount++; + } + Assert.IsTrue(received); + } + } } \ No newline at end of file diff -r 2c5f5e48d084b1bbfab25d663374abc6f5dc68f8 -r 9aea0843b34b1329c258f6b3803ee82f1b715c12 TinyIoC/TinyMessenger.cs --- a/TinyIoC/TinyMessenger.cs Sat Mar 13 12:33:13 2010 +0000 +++ b/TinyIoC/TinyMessenger.cs Sat Mar 13 13:53:34 2010 +0000 @@ -269,6 +269,21 @@ /// Type of message /// Message to deliver void Publish(TMessage message) where TMessage : class, ITinyMessage; + + /// + /// Publish a message to any subscribers asynchronously + /// + /// Type of message + /// Message to deliver + void PublishAsync(TMessage message) where TMessage : class, ITinyMessage; + + /// + /// Publish a message to any subscribers asynchronously + /// + /// Type of message + /// Message to deliver + /// AsyncCallback called on completion + void PublishAsync(TMessage message, AsyncCallback callback) where TMessage : class, ITinyMessage; } #endregion @@ -564,6 +579,27 @@ { PublishInternal(message); } + + /// + /// Publish a message to any subscribers asynchronously + /// + /// Type of message + /// Message to deliver + public void PublishAsync(TMessage message) where TMessage : class, ITinyMessage + { + PublishAsyncInternal(message, null); + } + + /// + /// Publish a message to any subscribers asynchronously + /// + /// Type of message + /// Message to deliver + /// AsyncCallback called on completion + public void PublishAsync(TMessage message, AsyncCallback callback) where TMessage : class, ITinyMessage + { + PublishAsyncInternal(message, callback); + } #endregion #region Internal Methods @@ -654,6 +690,13 @@ } }); } + + private void PublishAsyncInternal(TMessage message, AsyncCallback callback) where TMessage : class, ITinyMessage + { + Action publishAction = () => { PublishInternal(message); }; + + publishAction.BeginInvoke(callback, null); + } #endregion } #endregion