private void ProgressTimer_Callback(object state) { long workID = (long)state; DownloadProgressArgs args; // 获取下载状态 lock (this._syncRoot) { if (workID != this._workID) { return; // 这次下载已经过期 } var segments = this._writer.GetSegments(); args = new DownloadProgressArgs(segments); var now = DateTime.Now; args.Speed = (args.DownloadedSize - this._lastDownloadedSize) / Math.Max(1, (long)(now - this._lastProgressChangeTime).TotalSeconds); this._lastProgressChangeTime = now; this._lastDownloadedSize = args.DownloadedSize; }// lock // 触发进度改变事件 this.OnProgressChanged(args); // 启动下一次进度计时 lock (this._syncRoot) { if (workID != this._workID) { return; // 这次下载已经过期 } this._progressTimer.Change(ProgressTimerInterval, Timeout.Infinite); } }
private void OnProgressChanged(DownloadProgressArgs e) { EventHandler <DownloadProgressArgs> handler = this.ProgressChanged; if (handler != null) { handler(this, e); } }