stevo_ said:YAY! just what I wanted..
I;m preparing samples (just like futures .NET 4.0)
I can nave you a boost //So i'm currently working on a Pi calculation example.
In a lighting sample, you can take use of parallelism in programs like below (working sudoku generator):
public abstract class PluginBaseWorkItem<T>
{
private static object _sync = new object();
private T _item;
public T Item { get { return _item; } }
public void Run()
{
List<WaitHandle> _waitHandles = new List<WaitHandle>();
for (int i = 0; i < TaskCount; i++)
{
_waitHandles.Add(new AutoResetEvent(false));
}
for (int i = 0; i < TaskCount; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessHandle), _waitHandles[i]);
}
WaitHandle.WaitAll(_waitHandles.ToArray());
}
protected abstract void ProcessItem();
protected void SetValue(T item)
{
_item = item;
}
protected T GetValue()
{
return _item;
}
protected virtual int TaskCount { get { return Environment.ProcessorCount; } }
private void Process()
{
ProcessItem();
}
private void ProcessHandle(object sync)
{
AutoResetEvent waitHandle = (AutoResetEvent)sync;
Process();
waitHandle.Set();
}
}
private class WorkItem : PluginBaseWorkItem<Puzzle>
{
protected override void ProcessItem()
{
DlxEngine engine = new DlxEngine();
Puzzle value = engine.Generate(20);
lock (this)
{
Puzzle item = GetValue();
if (item == null || value.Rating > item.Rating)
{
SetValue(value);
}
}
}
}
public static IPuzzle Create()
{
WorkItem workItem = new WorkItem();
workItem.Run();
IPuzzle puzzle = workItem.Item;
return Create(puzzle.Text, puzzle.Seed);
}