ASP.NET Core WebApi возвращает ответ после обработки очереди - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть конечная точка, которая принимает некоторую сущность в качестве POST, называемую Entry.Эти записи имеют свойство OrderNumber, которое является числом от 1-n, определенным на основе записей, которые уже произошли сегодня.Поэтому, когда в базе данных на текущий день 100 записей, новый порядковый номер должен быть 101.

Так что же произойдет, когда вы дважды достигнете конечной точки с разных устройств (X и Y):

ИКС.Посылает запись

X.Запрашивает у базы данных текущие записи -> ответ с 100

Y.Посылает запись

Y.Запрашивает в базе данных текущие записи -> ответ с 100

X.Запись будет вставлена ​​с порядковым номером 101

Y.Запись будет вставлена ​​с помощью OrderNumber 101

Мое решение состоит в том, чтобы создать фоновую задачу с очередью (как показано здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1#queued-background-tasks) и создать запись там, чтобы гарантировать, что они обрабатываются одна за другой.

Теперь проблема в моем контроллере заключается в том, что я не могу вернуть последнюю запись с правильным OrderNumber во время запроса, потому что это происходит всякий раз, когда очередь обрабатывает эту запись.

Так какклиент получает ответ обратно правильно? Или есть лучший / другой способ обработки этих случаев?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Я только что нашел ответ на стек, который, кажется, решил мою проблему:

Как защитить ресурсы, которые могут использоваться в многопоточной или асинхронной среде?

0 голосов
/ 16 ноября 2018

Код пользовательского атрибута здесь:

public class SingleThreadAttribute : ActionFilterAttribute
{
    private static Object _thisLock = new Object();

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        Monitor.Enter(_thisLock);
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        base.OnActionExecuted(context);
        Monitor.Exit(_thisLock);
    }
}

При добавлении атрибута [SingleThread] в конечную точку действия вашего контроллера, если выполняется несколько вызовов одновременно, они будут обрабатываться по одному во время ожиданияблокировка будет снята предыдущим вызовом.

Это может быть решением для вашего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...