// called from separate thread void EmitRowsOverTime() { DateTime t = DateTime.Now; int totalRows = queryReader.TotalRecordsRead; while (true) { Thread.Sleep(5000); totalRows = queryReader.TotalRecordsRead; DateTime now = DateTime.Now; TimeSpan ts = now - t; bool cancelled = false; lock (workerLock) { WorkerProgress wb = workers.First(); if (wb.t != null && wb.t == Thread.CurrentThread && wb.cancelled) { cancelled = true; } } if (cancelled) { break; } else { OnQueryRowsOverTime((decimal)totalRows / (decimal)ts.TotalSeconds, totalRows); } } }
void OnReaderFinished() { lock (workerLock) { WorkerProgress wb = workers.First(); if (wb.t != null) { wb.cancelled = true; } } if (ReaderFinished != null) { //ReaderFinished(queryReader.TotalRecordsRead); ReaderFinished(this, new ReaderFinishedEvents(queryReader.TotalRecordsRead)); } }
/// <summary> /// Represents an Excel-compatible workbook file, with a specified WorkbookParams. /// </summary> /// <param name="p1"></param> public Workbook(WorkBookParams p1) { this.runParameters = p1; //// max rows is actually max rows subtract 1, since we're including row headers //this.runParameters.MaxRowsPerSheet = this.runParameters.MaxRowsPerSheet - 1; queryReader = new QueryReader(runParameters.Query, runParameters.QueryTimeout, runParameters.FromFile, runParameters.ConnectionString); workers = new List <WorkerProgress>(); Thread t = new Thread(EmitRowsOverTime); t.IsBackground = true; WorkerProgress w = new WorkerProgress(); w.t = t; w.cancelled = false; lock (workerLock) workers.Add(w); }