Asynchronous multi-threaded exception handling?

I want to have an exception handling approach in my asynchronous programming (beginInvoke / endInvoke) in which if any of the (beginInvoke) threads fails, then I want all other asynchronous threads to stop working. Please suggest some solution ?, below. I also add my sample code:

public List<ThreadResultDto> SendMailAsynch(List<ThreadRequestDto> requestDto) { List<ThreadResultDto> resultDto = new List<ThreadResultDto>(); List<IAsyncResult> asyncResults = new List<IAsyncResult>(); foreach (ThreadRequestDto t in requestDto) { //Create a delegate. DoSomeAsynchWorkDelegate del = new DoSomeAsynchWorkDelegate(DoSomeAsynchWork); // Initiate the asynchronous call IAsyncResult a = del.BeginInvoke(t,null, del); //IAsyncResult a = del.BeginInvoke(t, null,null); asyncResults.Add(a); } foreach (IAsyncResult ar in asyncResults) { // wait for each one to complete, then call EndInvoke, passing in the IAsyncResult. // We cast ar.AsyncState to a DoSomeAsynchWorkDelegate, as we passed it in as the second parameter to BeginInvoke. ar.AsyncWaitHandle.WaitOne(); //AsyncState property of IAsyncResult is used to get the delegate that was used to call that method DoSomeAsynchWorkDelegate del = (DoSomeAsynchWorkDelegate)ar.AsyncState; // Call EndInvoke to get the result. Add the result to the list of items. resultDto.Add(del.EndInvoke(ar)); } return resultDto; } 
+6
c # asynchronous
source share
1 answer

The best way is probably to use a generic ManualResetEvent .

For example:

 class MyClass { private ManualResetEvent workFailedEvent = new ManualResetEvent(false); public List<ThreadResultDto> SendMailAsynch(List<ThreadRequestDto> requestDto) { workFailedEvent.Reset(); // --- The rest of your code as written in your post --- } private void DoAsyncWorkFirst() { try { for (int i = 0; i < 10000; i++) { if (workFailedEvent.WaitOne(0, true)) { break; } // -- Do some work here --- } } catch (MyException) { workFailedEvent.Set(); } } private void DoAsyncWorkSecond() { try { for (int j = 0; j < 20000; j++) { if (workFailedEvent.WaitOne(0, true)) { break; } // --- Do some different work here --- } } catch (MyOtherException) { workFailedEvent.Set(); } } } 

The interesting part here is calling WaitOne (0, true) . If you use timeout 0, the thread will not block. Since the ManualResetEvent OS is synchronized by the OS, this particular method call is a convenient way to check the signal without having to worry about race conditions or perform your own lock.

+2
source share

All Articles