Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to make a series of asynchronous calls and then use the value returned by first thread?
    text
    copied!<p>I want to make asynchronous calls and then process the value returned by first thread. <strong>I don't want to use Parallel library.</strong> I can just use .Net 2.0. I have written the following program which should suffice my requirements. But can someone please point out if there is a better solution? Thanks.</p> <p>Here is my code:</p> <pre><code>class Program { private static Worker _worker2; private static Worker _worker3; private static Worker _worker4; private static Worker _worker1; delegate void DoWorkDelegate(object param); private static Worker _firstReturnedWorker = null; private static object lockObject = new object(); public static void Main() { _worker1 = new Worker(); _worker2 = new Worker(); _worker3 = new Worker(); _worker4 = new Worker(); int i = 10; DoWorkDelegate d1 = new DoWorkDelegate(_worker1.OnDoWork); d1.BeginInvoke(1, OnThreadReturned, ++i); DoWorkDelegate d2 = new DoWorkDelegate(_worker2.OnDoWork); d2.BeginInvoke(2, OnThreadReturned, ++i); DoWorkDelegate d3 = new DoWorkDelegate(_worker3.OnDoWork); d3.BeginInvoke(3, OnThreadReturned, ++i); DoWorkDelegate d4 = new DoWorkDelegate(_worker4.OnDoWork); d4.BeginInvoke(4, OnThreadReturned, ++i); Console.ReadKey(); } private static void OnThreadReturned(IAsyncResult ar) { lock (lockObject) { if (_firstReturnedWorker == null) { var workerIdentifier = (int)ar.AsyncState; switch (workerIdentifier) { case 11: _firstReturnedWorker = _worker1; break; case 12: _firstReturnedWorker = _worker2; break; case 13: _firstReturnedWorker = _worker3; break; case 14: _firstReturnedWorker = _worker4; break; } } else { return; } } Console.WriteLine("First result received was {0}", _firstReturnedWorker.ReturnedValue); } } public class Worker { public string ReturnedValue { get; private set; } public void OnDoWork(object value) { ReturnedValue = Process((int)value); } private string Process(int numberToProcess) { return string.Format("{0} was processed by {1}", numberToProcess, Thread.CurrentThread.ManagedThreadId); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload