SimpleWorkItemDispatcher
SimpleWorkItemDispatcher handles execution of WorkItems by
directly executing them. It is provided so that a dispatcher
is always available in the context, thereby simplifying the
code needed to run child tests.
using System.Threading;
namespace NUnit.Framework.Internal.Execution
{
public class SimpleWorkItemDispatcher : IWorkItemDispatcher
{
private WorkItem _topLevelWorkItem;
private Thread _runnerThread;
private object cancelLock = new object();
public void Start(WorkItem topLevelWorkItem)
{
_topLevelWorkItem = topLevelWorkItem;
_runnerThread = new Thread(RunnerThreadProc);
if (topLevelWorkItem.TargetApartment == ApartmentState.STA)
_runnerThread.SetApartmentState(ApartmentState.STA);
_runnerThread.Start();
}
public void Dispatch(WorkItem work)
{
work?.Execute();
}
private void RunnerThreadProc()
{
_topLevelWorkItem.Execute();
}
public void CancelRun(bool force)
{
lock (cancelLock) {
if (_topLevelWorkItem != null) {
_topLevelWorkItem.Cancel(force);
if (force)
_topLevelWorkItem = null;
}
}
}
}
}