Could be useful for bombarding SQL...
I wanted to run a bunch of methods simultaneously on as many threads as possible to get the job done, but still wait at the end. I know MS have something coming to solve this, but wanted a lightweight solution, so here it is:
public class Parallel
{
public static T[] ExecuteWaitAll<T>(Func<T>[] functions)
{
List<T> resultSet = new List<T>();
int i = 0;
object lockObject = new object();
foreach (Func<T> function in functions)
{
lock (lockObject)
{
i++;
function.BeginInvoke(delegate(IAsyncResult result)
{
lock (lockObject)
{
resultSet.Add(function.EndInvoke(result));
i--;
}
}, null);
}
}
while (i > 0)
{
Thread.Sleep(1);
}
return resultSet.ToArray();
}
}
To use this, you simply call it with a list of delegates you want to execute, and define the return type:
public void ExecuteWait()
{
List<Func<int>> list = new List<Func<int>>();
for (int i=0; i<100; i++)
{
list.Add(new Func<int>(delegate()
{
Thread.Sleep(1000);
return 1;
}));
}
int[] quantity = Parallel.ExecuteWaitAll<int>(list.ToArray());
int count = 0;
foreach (int result in quantity)
{
count += result;
}
}
The result is now valid for 100 executions but took a lot less time than 100 seconds to calculate. You could of course just be running four things at the same time, all different using this.
No comments:
Post a Comment