Я новичок в 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 и если кто-то добавляет другую очередь, когда текущая компиляция все еще выполняется, это становится проблемой.
Любой ответ будет оценен.