mirror of
https://github.com/farcasclaudiu/SmartThreadPool.git
synced 2026-06-28 09:01:04 +03:00
v1.0
SmartThreadPool v1.0
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
using Amib.Threading;
|
||||
|
||||
namespace WorkItemsGroupTests
|
||||
{
|
||||
public class CallerState
|
||||
{
|
||||
private int _val = 0;
|
||||
|
||||
public int Value
|
||||
{
|
||||
get { return _val; }
|
||||
}
|
||||
|
||||
protected void IncValue()
|
||||
{
|
||||
++_val;
|
||||
}
|
||||
}
|
||||
|
||||
public class NonDisposableCallerState : CallerState
|
||||
{
|
||||
public NonDisposableCallerState()
|
||||
{
|
||||
IncValue();
|
||||
}
|
||||
}
|
||||
|
||||
public class DisposableCallerState : CallerState, IDisposable
|
||||
{
|
||||
public DisposableCallerState()
|
||||
{
|
||||
IncValue();
|
||||
}
|
||||
|
||||
#region IDisposable Members
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
IncValue();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Summary description for StateDisposeExample.
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
[Category("WorkItemsGroup")]
|
||||
public class TestStateDispose
|
||||
{
|
||||
public TestStateDispose()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example of non disposable caller state
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void DisposeCallerState()
|
||||
{
|
||||
SmartThreadPool smartThreadPool = new SmartThreadPool();
|
||||
|
||||
WIGStartInfo wigStartInfo = new WIGStartInfo();
|
||||
wigStartInfo.DisposeOfStateObjects = true;
|
||||
|
||||
IWorkItemsGroup workItemsGroup = smartThreadPool.CreateWorkItemsGroup(int.MaxValue, wigStartInfo);
|
||||
|
||||
CallerState nonDisposableCallerState = new NonDisposableCallerState();
|
||||
CallerState disposableCallerState = new DisposableCallerState();
|
||||
|
||||
IWorkItemResult wir1 =
|
||||
workItemsGroup.QueueWorkItem(
|
||||
new WorkItemCallback(this.DoSomeWork),
|
||||
nonDisposableCallerState);
|
||||
|
||||
IWorkItemResult wir2 =
|
||||
workItemsGroup.QueueWorkItem(
|
||||
new WorkItemCallback(this.DoSomeWork),
|
||||
disposableCallerState);
|
||||
|
||||
wir1.GetResult();
|
||||
Assert.AreEqual(1, nonDisposableCallerState.Value);
|
||||
|
||||
wir2.GetResult();
|
||||
|
||||
// Wait a little bit for the working thread to call dispose on the
|
||||
// work item's state.
|
||||
workItemsGroup.WaitForIdle();
|
||||
|
||||
Assert.AreEqual(2, disposableCallerState.Value);
|
||||
|
||||
smartThreadPool.Shutdown();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Example of non disposable caller state
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void DontDisposeCallerState()
|
||||
{
|
||||
SmartThreadPool smartThreadPool = new SmartThreadPool();
|
||||
|
||||
WIGStartInfo wigStartInfo = new WIGStartInfo();
|
||||
wigStartInfo.DisposeOfStateObjects = false;
|
||||
|
||||
IWorkItemsGroup workItemsGroup = smartThreadPool.CreateWorkItemsGroup(int.MaxValue, wigStartInfo);
|
||||
|
||||
bool success = false;
|
||||
|
||||
CallerState nonDisposableCallerState = new NonDisposableCallerState();
|
||||
CallerState disposableCallerState = new DisposableCallerState();
|
||||
|
||||
IWorkItemResult wir1 =
|
||||
workItemsGroup.QueueWorkItem(
|
||||
new WorkItemCallback(this.DoSomeWork),
|
||||
nonDisposableCallerState);
|
||||
|
||||
IWorkItemResult wir2 =
|
||||
workItemsGroup.QueueWorkItem(
|
||||
new WorkItemCallback(this.DoSomeWork),
|
||||
disposableCallerState);
|
||||
|
||||
wir1.GetResult();
|
||||
success = (1 == nonDisposableCallerState.Value);
|
||||
|
||||
wir2.GetResult();
|
||||
|
||||
success = success && (1 == disposableCallerState.Value);
|
||||
|
||||
smartThreadPool.Shutdown();
|
||||
|
||||
Assert.IsTrue(success);
|
||||
}
|
||||
|
||||
private object DoSomeWork(object state)
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user