这是一个分离关注点的练习,最初我将把这个程序分成
work provider
和
worker
. 提供者负责队列和执行控制,而工作者则负责计算。下面的代码是一个粗糙的开始,但它应该让你去。
将这两个问题分开,并使用构造函数注入已经在可测试性方面取得了成效,现在您可以完全测试了
Worker
Program
.
考虑到你的应用程序的进一步开发,我强烈建议你
the Task Parallel Library
here
.
public interface IWorkProvider
{
bool ShouldStop { get; }
long? GetWork();
}
public class Program : IWorkProvider
{
private static bool _shouldStop = false;
private static ConcurrentQueue<long> _workQueue = new ConcurrentQueue<long>();
public bool ShouldStop { get { return _shouldStop; } }
public long? GetWork()
{
long currentValue;
bool worked = _workQueue.TryDequeue(out currentValue);
if (worked)
return currentValue;
return null;
}
}
public class Worker
{
private long _results;
private readonly IWorkProvider _workProvider;
public long Results { get { return _results; }}
public Worker(IWorkProvider workProvider)
{
_workProvider = workProvider;
}
public void DoWork()
{
while (!_workProvider.ShouldStop)
{
long? work = _workProvider.GetWork();
if (work.HasValue)
{
_results += work.Value;
Debug.WriteLine("DeQueue: " + work.Value);
}
else
{
Thread.Sleep(10);
}
}
}
}