Exemplo n.º 1
0
        // 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("退出后台循环");
            });
        }
Exemplo n.º 2
0
 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)
     { }
 }