Asheesh,

I'm comparing the different approaches, the one in StackOverFlow works well,
this is what I don't like:
* I think it's hard to work with multiple services using events instead of
callbacks (as in my example),
* They're using an AutoResetEvent, which we get for free if we use the
callbacks, so that means less things to set up.
* They're using a BackgroundWorker and a Thread
* They're using an event to notify, which is really not necessary (altough a
clear). We could directly do whatever we need after the WaitOne or after
calling Start (instead of raising the event).
* They're starting the BackgroundWorker and leave it there just waiting,
this should be done only just before calling the services.
* The event should be raised on the UI Thread

I did some changes to that sample. I can send it to you as a reference.
I don't think it would make a huge difference in performance, since any perf
hit due to thread synchronization logic would be nothing compare to multiple
service calls. However, I've not had a chance to do any perf testing.


*BTW. *I think you forgot to use the BackgroundWorker and that's why when
you tried to use this approach the application was locked on the first
WaitOne since it was done in the UI Thread (just as the even returning from
the ServiceCall).



On Wed, Aug 12, 2009 at 10:24 PM, Miguel Madero <[email protected]> wrote:

> Attached is a brief example on how to do this using the WaitHandle in the
> IAsyncResult returned by each async method.
>
> The code is simple. In Silverlight I just do 10 service call that will add
> an item to a ListBox. I'll wait until all the service calls end to add
> another message to the list (this has to run in a different thread to avoid
> blocking the UI). Also note that adding items to the list have to be done
> through the Dispatcher sicne they will modify the UI. There're a bunch of
> lamdas, but it's easy to follow.
>
>
>  public MainPage()
>         {
>             InitializeComponent();
>             var results = new ObservableCollection<string>();
>             var asyncResults = new List<IAsyncResult>();
>             resultsList.ItemsSource = results;
>             var service = new Service1Client() as Service1;
>
>             1.To(10).Do(i=>
>                 asyncResults.Add(service.BeginDoWork(ar =>
>                     Dispatcher.BeginInvoke(() =>
> results.Add(String.Format("Call {0} finished: {1}", i,
> service.EndDoWork(ar)))),
>                     null))
>             );
>
>             new Thread(()=>
>             {
>                 asyncResults.ForEach(a => a.AsyncWaitHandle.WaitOne());
>                 Dispatcher.BeginInvoke(() => results.Add("Everything
> finished"));
>             }).Start();
>         }
>
> Just to help with the testing, this is the service
>
> public class Service1
>     {
>         private const int maxMilliSecs = 500;
>         private const int minMillisSecs = 100;
>         [OperationContract]
>         public int DoWork()
>         {
>             int millisSecsToWait = new Random().Next(maxMilliSecs -
> minMillisSecs) + minMillisSecs;
>             Thread.Sleep(millisSecsToWait);
>             return millisSecsToWait;
>         }
>     }
>
>
>
> On Wed, Aug 12, 2009 at 9:21 PM, Miguel Madero <[email protected]>wrote:
>
>> Ali is going to give a talk on the Rx framework at the next SDDN Event in
>> Sydney :)
>>
>> On Wed, Aug 12, 2009 at 7:48 PM, Jordan Knight <[email protected]
>> > wrote:
>>
>>>  I had a quick look at this the other day and when I compiled up the
>>> reactive dll, the classes were different that in the example:
>>>
>>>
>>>
>>> ObservableExtensions
>>>
>>>         DoAsync
>>>
>>> Didn't exist?
>>>
>>>
>>>
>>> I didn't really examine where I was going wrong in any great depth, so If
>>> you have any success I'd be interested to hear about it :)
>>>
>>>
>>>
>>>
>>>
>>> *Jordan Knight*
>>> Readify | Senior Consultant
>>> Lead Trainer - Rich Interactive Media
>>>
>>> Suite 408 LifeLabs Building | 198 Harbour Esplanade | Docklands | VIC
>>> 3008 | Australia
>>>
>>> M: +61 403 532 404 | E: [email protected] | W:
>>> http://www.readify.net | B: http://blog.webjak.net
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> *From:* [email protected] [mailto:
>>> [email protected]] *On Behalf Of *Jake Ginnivan
>>>
>>> *Sent:* Wednesday, 12 August 2009 6:32 PM
>>> *To:* [email protected]
>>> *Subject:* RE: Wait for multiple Async calls to finish (SL3)
>>>
>>>
>>>
>>>
>>> http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html
>>>
>>>
>>>
>>> Have a look at this, the Silverlight team use it in their unit testing. I
>>> still have not used it yet, but really keen to dive in and use this stuff.
>>>
>>>
>>>
>>> *Jake Ginnivan*
>>>
>>> IT Coordinator
>>>
>>>
>>>
>>> ioGlobal Pty Ltd.
>>>
>>> ISO 9001 Quality Certified
>>>
>>> *Resource **Analytics** & Data Systems **Automation***
>>>
>>> T:  +61 8 6555 6510
>>>
>>> F:  +61 8 6311 3256
>>>
>>> M:  +61 403 846 400
>>>
>>> E:  *[email protected]***
>>>
>>> www.ioglobal.net
>>>
>>>
>>>
>>> *From:* [email protected] [mailto:
>>> [email protected]] *On Behalf Of *Asheesh Soni
>>> *Sent:* Wednesday, 12 August 2009 3:49 PM
>>> *To:* [email protected]
>>> *Subject:* Wait for multiple Async calls to finish (SL3)
>>>
>>>
>>>
>>> Any one knows a better / cleaner way to do this than:
>>>
>>> http://silverlight.net/forums/t/12437.aspx
>>> http://silverlight.net/forums/t/72631.aspx
>>>
>>> I have already dumped daisy-chaining of calls in favor of multiple async
>>> calls with a boolean flag for each.
>>> After calling all the async operations, I am using a DispatcherTimer
>>> ticker event to poll if all the flags have been set.
>>> Works like a charm, and a huge improvement in performance and readability
>>> over the chaining. But still not the perfect solution.
>>>
>>> I couldn't get this one to work:
>>>
>>> http://stackoverflow.com/questions/811855/threading-multiple-async-calls-silverlight
>>> The thread sleeps for ever on the 1st .waitone call.
>>>
>>> Any ideas?
>>>  ------------------------------
>>>
>>> Support procedure: https://www.codify.com/lists/support
>>> List address: [email protected]
>>> Subscribe: [email protected]
>>> Unsubscribe: [email protected]
>>> List FAQ: http://www.codify.com/lists/ozsilverlight
>>> Other lists you might want to join: http://www.codify.com/lists
>>>  ------------------------------
>>>
>>> Support procedure: https://www.codify.com/lists/support
>>> List address: [email protected]
>>> Subscribe: [email protected]
>>> Unsubscribe: [email protected]
>>> List FAQ: http://www.codify.com/lists/ozsilverlight
>>> Other lists you might want to join: http://www.codify.com/lists
>>>   ------------------------------
>>> Support procedure: https://www.codify.com/lists/support
>>> List address: [email protected]
>>> Subscribe: [email protected]
>>> Unsubscribe: [email protected]
>>> List FAQ: http://www.codify.com/lists/ozsilverlight
>>> Other lists you might want to join: http://www.codify.com/lists
>>>
>>
>>
>>
>> --
>> Miguel A. Madero Reyes
>> www.miguelmadero.com (blog)
>> [email protected]
>>  ------------------------------
>> Support procedure: https://www.codify.com/lists/support
>> List address: [email protected]
>> Subscribe: [email protected]
>> Unsubscribe: [email protected]
>> List FAQ: http://www.codify.com/lists/ozsilverlight
>> Other lists you might want to join: http://www.codify.com/lists
>>
>
>
>
> --
> Miguel A. Madero Reyes
> www.miguelmadero.com (blog)
> [email protected]
>  ------------------------------
> Support procedure: https://www.codify.com/lists/support
> List address: [email protected]
> Subscribe: [email protected]
> Unsubscribe: [email protected]
> List FAQ: http://www.codify.com/lists/ozsilverlight
> Other lists you might want to join: http://www.codify.com/lists
>



-- 
Miguel A. Madero Reyes
www.miguelmadero.com (blog)
[email protected]
--------------------------------------------------------------------------------
Support procedure: https://www.codify.com/lists/support
List address: [email protected]
Subscribe: [email protected]
Unsubscribe: [email protected]
List FAQ: http://www.codify.com/lists/ozsilverlight
Other lists you might want to join: http://www.codify.com/lists

Reply via email to