public void RunAndWait() { ThreadPool.QueueUserWorkItem(QueueFiller); for (int i = 0; i < _parent.Config.ThreadCount; i++) { ThreadPool.QueueUserWorkItem(ThreadRender); } bool completed = false; while (!completed) { EventPassing eventToRaise = null; while (true) { lock (_syncLock) { if (_raiseEvents.Count > 0) { eventToRaise = _raiseEvents.Dequeue(); } } if (eventToRaise == null) { //No more events break; } else { switch (eventToRaise.Type) { case EventPassing.EventType.Begin: _parent.InvokeBeginRendering( _invoker, _group, _scale, eventToRaise.Row, eventToRaise.Col); break; case EventPassing.EventType.Finish: _parent.InvokeFinishRendering( _invoker, _group, _scale, eventToRaise.Row, eventToRaise.Col); break; case EventPassing.EventType.Error: eventToRaise.Result = _parent.InvokeError( _invoker, _group, _scale, eventToRaise.Row, eventToRaise.Col, eventToRaise.Exception); break; default: //Not translated, because it is an internal error that should never happen throw new Exception("Bad event type"); //NOXLATE } eventToRaise.Event.Set(); eventToRaise = null; } } lock (_syncLock) { if (_completeFlag == 0 && _raiseEvents.Count == 0) { completed = true; } } if (!completed) { _event.WaitOne(5 * 1000, true); } } }
/// <summary> /// Renders a single tile /// </summary> /// <param name="ev"></param> /// <param name="tileSvc"></param> /// <param name="row">The row index of the tile</param> /// <param name="col">The column index of the tile</param> /// <param name="scaleindex">The scale index of the tile</param> /// <param name="group">The name of the baselayer group</param> private void RenderTile(EventWaitHandle ev, ITileService tileSvc, long row, long col, int scaleindex, string group) { ev.Reset(); lock (_syncLock) { _raiseEvents.Enqueue(new EventPassing( EventPassing.EventType.Begin, (int)row, (int)col, null, ev )); _event.Set(); } ev.WaitOne(Timeout.Infinite, true); int c = _parent.Config.RetryCount; while (c > 0) { c--; try { if (!_parent.Cancel) { if (_parent.Config.RenderMethod == null) { tileSvc.GetTile(_mapDefinition, group, (int)col, (int)row, scaleindex).Dispose(); //NOXLATE } else { _parent.Config.RenderMethod(_mapDefinition, group, (int)col, (int)row, scaleindex); } } break; } catch (Exception ex) { if (c == 0) { Exception pex = ex; ev.Reset(); EventPassing evobj = new EventPassing( EventPassing.EventType.Error, (int)row, (int)col, ex, ev ); lock (_syncLock) { _raiseEvents.Enqueue(evobj); _event.Set(); } ev.WaitOne(Timeout.Infinite, true); if (evobj.Result == null) { break; } if (pex == evobj.Result) { throw; } else { throw (Exception)evobj.Result; } } } } ev.Reset(); lock (_syncLock) { _raiseEvents.Enqueue(new EventPassing( EventPassing.EventType.Finish, (int)row, (int)col, null, ev )); _event.Set(); } ev.WaitOne(Timeout.Infinite, true); }
/// <summary> /// Renders a single tile /// </summary> /// <param name="ev"></param> /// <param name="tileSvc"></param> /// <param name="row">The row index of the tile</param> /// <param name="col">The column index of the tile</param> /// <param name="scaleindex">The scale index of the tile</param> /// <param name="group">The name of the baselayer group</param> private void RenderTile(EventWaitHandle ev, ITileService tileSvc, long row, long col, int scaleindex, string group) { ev.Reset(); lock (SyncLock) { RaiseEvents.Enqueue(new EventPassing( EventPassing.EventType.Begin, (int)row, (int)col, null, ev )); Event.Set(); } ev.WaitOne(Timeout.Infinite, true); int c = Parent.Config.RetryCount; while (c > 0) { c--; try { if (!Parent.Cancel) if (Parent.Config.RenderMethod == null) tileSvc.GetTile(MapDefinition, group, (int)col, (int)row, scaleindex, "PNG").Dispose(); //NOXLATE else Parent.Config.RenderMethod(MapDefinition, group, (int)col, (int)row, scaleindex); break; } catch (Exception ex) { if (c == 0) { Exception pex = ex; ev.Reset(); EventPassing evobj = new EventPassing( EventPassing.EventType.Error , (int)row, (int)col, ex, ev ); lock (SyncLock) { RaiseEvents.Enqueue(evobj); Event.Set(); } ev.WaitOne(Timeout.Infinite, true); if (evobj.Result == null) break; if (pex == evobj.Result) throw; else throw (Exception)evobj.Result; } } } ev.Reset(); lock (SyncLock) { RaiseEvents.Enqueue(new EventPassing( EventPassing.EventType.Finish, (int)row, (int)col, null, ev )); Event.Set(); } ev.WaitOne(Timeout.Infinite, true); }