【问题标题】:How can I stop my WinForms app for 10 minutes?如何停止我的 WinForms 应用程序 10 分钟?
【发布时间】:2017-03-01 15:37:35
【问题描述】:

我有一个 C# Winforms 程序将订单数据发送到第 3 方 API。该程序在服务器上运行,并有一个计时器来检查每 10 秒发送到 API 的数据。

我的问题是有时第 3 方的服务器出现故障。发生这种情况时,我不希望我的程序尝试发送数据,然后创建一封电子邮件给用户,告诉他们他们的销售订单每 10 秒失败一次。

这是我设置计时器并每 10 秒调用一次作业的代码:

        private static void SetTimer()
    {
        aTimer = new System.Timers.Timer(10000);
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

工作本身并不重要,它运行起来没有问题。

如果 API 没有响应,我会收到 500 到 503 之间的错误,所以我写了这个:

                if (statusCode > 500 || statusCode < 504)
            {

                aTimer.Enabled = false;
                System.Threading.Thread.Sleep(600000);
                aTimer.Enabled = true;
                return;
            }
            else
            {
                // This will post the migration status for anything EXCEPT a  server failure
                PostMigrationStatus(DocEntry, JobSuccess, jobID);
            }

错误处理不起作用,似乎在遇到 500-503 错误后,作业再也不会开始了。

有什么想法吗?

【问题讨论】:

    标签: c# winforms timer


    【解决方案1】:

    如果您尝试仅捕获错误 501、502 和 503,请将 if 语句中的 || 更改为 &amp;&amp;。现在,if 正在捕获所有状态代码。而且,实际上,既然您说要专门寻找 500 到 503,您需要将 &gt; 更改为 &gt;=,如:if (statusCode &gt;= 500 &amp;&amp; statusCode &lt; 504)

    【讨论】:

    • 呃,这是个大问题。我会更改并报告。
    • 只是想说所有这些答案中有很多很好的信息,但最大的问题是||与&&。我的愚蠢错误,但感谢您找到它。感谢大家的帮助。
    【解决方案2】:

    为什么不使用你已经拥有的计时器来管理睡眠:

    if (statusCode > 500 || statusCode < 504)
    {
        aTimer.Interval = 600000;
        return;
    }
    

    然后,在您的计时器回调代码中,您可以检查正常操作是否已恢复并将Interval 重置回10000

    【讨论】:

    • 太好了,我会这样做并报告。
    【解决方案3】:

    在你的类中添加这些变量。

    static bool IsErrorWait = false;
    static double DefaultTick = 10000;
    static double WaitTick = 600000;
    

    如下所示改变你的静态方法

    private static void SetTimer()
    {
        aTimer = new System.Timers.Timer(DefaultTick);
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }
    

    然后在 Timer Event 中添加这段代码。

    if (IsErrorWait == true)
    {
        aTimer.Interval = DefaultTick;
        IsErrorWait = false;
    }
    
    if (statusCode >= 500 && statusCode <= 504)
    {
        IsErrorWait = true;
        aTimer.Interval = WaitTick;
        return;
    }
    else
    {
        // This will post the migration status for anything EXCEPT a  server failure
        PostMigrationStatus(DocEntry, JobSuccess, jobID);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 1970-01-01
      • 2021-08-28
      • 2012-03-29
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多