如何等待(数据库更改);在 Web API 控制器 C# 中

问题描述 投票:0回答:2

我编写了一些 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}

有人可以帮助我吗?

c# .net controller webapi
2个回答
1
投票

您可以使用

WhenAny
创建一个
Task
,该任务将在多个任务之一完成时完成,与
Task.Delay
结合创建一个将在 10 秒内完成的任务。一旦
WhenAny
完成,您就可以检查您的
Task
是否已完成,如果是,结果是什么。


0
投票

您希望递归方法在状态下运行,但何时中断? 对于此示例,我将 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
}
© www.soinside.com 2019 - 2024. All rights reserved.