我有一个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错误后,作业永远不会再次启动。
有什么想法吗?
答案 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);
}