Asynchronous ForEach and Funky Anonymous Delegates
I was working with some code based on an excellent article on multi-threaded technics in the May 2007 MSDN Magazine. One of the code snippets that was provided is a ForAll routine. For my use, I simplified it a little from the article. The new code snippet is attached
private static void ForAll<T>(IList<T> data, Action<T> a) { CountdownLatch latch = new CountdownLatch(data.Count); for (int i = 0; i < data.Count; i++) { int idx = i; ThreadPool.QueueUserWorkItem(delegate { a(data[idx]); latch.Signal(); } ); } latch.Wait(); }
One of the interesting points in the code is the
int idx = i;
It is required, and without it, the delegate will use the value of i that is currently in use by the for loop that surrounds it.
1 comment:
Nice - could easily be a simple interview question for candidates who claim they know multithreading or that (and I've heard this) the framework handles it all now.
Just change the idx = i and ask "What's wrong with this code?"
Post a Comment