// TODO: 遇到 Server 连接失败情况,下次循环处理的等待时间要变长。也就是说只有 ListTags() API 成功情况下才能马上立即重新请求 // 启动后台任务。 // patameters: // new_action GetChannel() 遇到需要 new channel 时候调用的回调函数 // skip_action 循环中设置的一个检查点,若回调函数返回 true 则 continue // loop_action 循环中每一轮需要用 channel 做的事情 public void Start( delegate_action new_action, delegate_skip skip_func, delegate_action loop_action, CancellationToken token) { _new_action = new_action; Task.Run(async() => { TimeSpan wait_time = this.ShortWaitTime; while (token.IsCancellationRequested == false) { // TODO: 中间进行配置的时候,确保暂停在这个位置 // 延时 try { await Task.Delay(// TimeSpan.FromMilliseconds(1000), wait_time, token); } catch { return; } // Loop?.Invoke(this, new EventArgs()); if (skip_func == null) { if (string.IsNullOrEmpty(this.Url)) { SetError?.Invoke(null, new SetErrorEventArgs { Error = null }); continue; } } else { if (skip_func?.Invoke() == true) { continue; } } //if (this.State == "pause") // continue; if (loop_action == null) { continue; } bool error = false; this.Lock.EnterReadLock(); // 锁定范围以外,可以对通道进行 Clear() try { try { var channel = GetChannel(); try { loop_action(channel); wait_time = this.ShortWaitTime; } finally { ReturnChannel(channel); } } catch (Exception ex) { error = true; wait_time = this.LongWaitTime; SetError?.Invoke(ex, new SetErrorEventArgs { Error = $"{this.Name} 出现异常: {ExceptionUtil.GetAutoText(ex)}" }); } } finally { this.Lock.ExitReadLock(); } // 出过错以后就要清理通道集合 if (error) { this.Clear(); } } // App.CurrentApp.Speak("退出后台循环"); }); }
void PrintClass_OnSetError(string text) { try { if (this.InvokeRequired) { SetError del = new SetError(PrintClass_OnSetError); this.Invoke(del, text); } else { label18.ForeColor = Color.Red; label18.Text = text; this.Refresh(); System.Threading.Thread.Sleep(500); } } catch (ObjectDisposedException) { } }