Как обнаружить определенные (базы данных) изменения в SignalR? - PullRequest
0 голосов
/ 25 апреля 2020

Я новичок в SignalR, в основном у меня есть приложение, которое автоматически компилирует (msbuild.exe) проект Visual Studio. У моего приложения будет процесс очереди, потому что один и тот же проект будет собирать несколько человек.

Вот мой клиентский хаб.

'use strict';

//initialize signalr connection
var connection = new signalR.HubConnectionBuilder().withUrl('/Home/Index').build();

//initialize terminal
var term = new Terminal();
term.open(document.getElementById('terminal'));

//after signalr started
connection.start().then(function () {
    //do something after start
}).catch(function (err) {
    return console.error(err.toString());
});

//from hub
connection.on('BuildOutput', function (output) {
    term.write(output + '\n\r');
});

//call hub
document.getElementById('btnQueue').addEventListener('click', function (event) {
    connection.invoke('AddQueue',
        projectType,
        version
    ).catch(function (err) {
        return console.error(err.toString());
    });
    event.preventDefault();
});

Вот мой серверный хаб

public class TerminalHub : Hub
    {
        private IUnitOfWork _uow;

        public TerminalHub()
        {
            this._uow = new UnitOfWork();
        }

        public async Task AddQueue(string projectType, string version)
        {
            //add to BuildQueue
            _uow.Build.AddQueue(
                projectType,
                version,
                Context.User.Identity.Name
            );

            var queues = _uow.Build.GetWaitingQueue(projectType);
            await Clients.All.SendAsync("UpdateQueue", queues);
        }
        public async Task Build(int id, string projectType, string version)
        {
            var logFile = "msbuild.log";
            var command = "C:\\WINDOWS\\Microsoft.NET\\Framework\\v4.0.30319\\msbuild.exe";
            var arguments = "myArguments"

            var cli = Cli.Wrap(command).WithValidation(CommandResultValidation.None).WithArguments(arguments);

            await foreach (var cmdEvent in cli.ListenAsync())
            {
                switch (cmdEvent)
                {
                    case StartedCommandEvent started:
                        await Clients.All.SendAsync("BuildOutput", "ProcessID: " + started.ProcessId);
                        break;
                    case StandardOutputCommandEvent stdOut:
                        await Clients.All.SendAsync("BuildOutput", stdOut.Text);
                        break;
                    case StandardErrorCommandEvent stdErr:
                        await Clients.All.SendAsync("BuildOutput", stdErr.Text);
                        break;
                    case ExitedCommandEvent exited:
                        await Clients.All.SendAsync("BuildOutput", "ExitCode: " + exited.ExitCode);
                        break;
                }
            }
        }
    }

Мой вопрос: как я могу обнаружить изменения? В этом случае мне нужно быть в состоянии определить, когда кто-то добавляет очередь и выполнить процесс Build, технически я могу сделать это, вызвав Build после AddQueue, но проблема в том, что Build обычно занимает около 30 минут. / queue и если кто-то добавляет другую очередь, когда текущая компиляция все еще выполняется, это становится проблемой.

Любой ответ будет оценен.

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