如何停止我的WinForms应用程序10分钟?

时间:2017-03-01 15:37:36

标签: c# winforms timer

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

我的问题是,有时第三方服务器出现故障。当发生这种情况时,我不希望我的程序尝试发送数据,然后向用户发送电子邮件,告诉他们他们的销售订单每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错误后,作业永远不会再次启动。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

如果您尝试仅捕获错误501,502和503,请将||语句中的if更改为&&。此时,if>捕获所有状态代码。而且,实际上,既然您说过要专门查看500到503,那么您需要将>=更改为if (statusCode >= 500 && statusCode < 504),如:{{1}}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

在班上添加这些变量。

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事件中添加此代码。

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);
}