public void DoWork() { while (true) { lock (source) { if (source.from < source.to && !source.abort) { index = source.from++; } else { lock (this) { thread = null; completed = true; if (--source.active == 0) { source.OnComplete(); } return; } } } try { source.work(threadIndex, index, source); } catch (Exception e) { Util.Logging.Log(e); } } }