我编写了一些 Web API 控制器来为移动应用程序提供服务。
在其中一个控制器中,我在数据库中插入一些数据(状态为0),然后我需要等待其他外部调用来更改状态,并且当更改时(或已经过去10秒)返回一个JSON。
所以继续:在我的 Web API 控制器继续之前,我需要等待表上的列(具有唯一 ID)发生更改...如果该列在 10 秒内没有更改,那么它将返回错误...
我试图使用
SqlDependency
,但我无法让它等到更改,我不想在更改后触发某些内容,我需要知道它在等待时是否已更改...
我需要这样的东西:
int RequestStatus = await CheckRequestStatusChangeOnDB(RequestID,10);
//await until database change or until 10 seconds has passed...
if (RequestStatus == 1)
{//do something}
if (RequestStatus == 2)
{//do something}
if (RequestStatus == 0)
{//no change in database}
有人可以帮助我吗?
您可以使用
WhenAny
创建一个 Task
,该任务将在多个任务之一完成时完成,与 Task.Delay
结合创建一个将在 10 秒内完成的任务。一旦 WhenAny
完成,您就可以检查您的 Task
是否已完成,如果是,结果是什么。
您希望递归方法在状态下运行,但何时中断? 对于此示例,我将 10 标记为中断值。
public async bool CheckRequestStatus(int requestId, StatusEnum lastStatus)
{
int requestStatus = await GetRequestStatusById(requestId);
if (requestStatus == lastStatus)
{
Task.Delay(10);
CheckRequestStatus(requestId, requestStatus);
}
switch(Enum.Parse<StatusEnum>(requestId))
case Processing:
DoProcess();
CheckRequestStatus(requestId, Processing);
break;
case Finishing:
DoFinishing();
CheckRequestStatus(requestId, Finishing);
break;
case End:
DoEnd();
break;
default:
break;
return true;
}
public enum StatusEnum{
Processing = 1,
Finishing = 2,
End = 10
}