Отчет о проделанной работе с использованием интерфейса SignalR и IProgress
У меня есть класс Hub, который имеет метод длительного запуска, мне нужно отображать индикатор выполнения, пока он работает.
Я прочитал эту статью и думаю, что можно использовать интерфейс IProgress в асинхронных методах для отправки состояния длительной работы.
Я пишу такой метод:
public async Task<string> GetServerTime(IProgress<int> prog)
{
await Task.Run(() => {
for (int i = 0; i < 10; i++)
{
prog.Report(i * 10);
System.Threading.Thread.Sleep(200);
}
});
return DateTime.Now.ToString();
}
И я пытаюсь вызвать метод следующим образом:
var appHub = $.connection.appHub;
$.connection.hub.start();
appHub.server.getServerTime()
.done(function (time) {
alert(time);
});
Но я не знаю, как я могу получить отчеты о проделанной работе.
2 ответа
Вы можете использоватьprogress
, в качестве таких:
var appHub = $.connection.appHub;
$.connection.hub.start().done(function() {
appHub.server.getServerTime()
.progress(function (update) { alert(update); })
.done(function (time) { alert(time); });
});
Кстати, нет смысла использовать Task.Run
более связанный с процессором код на стороне сервера. Ваш серверный код может быть таким же простым:
public string GetServerTime(IProgress<int> prog)
{
for (int i = 0; i < 10; i++)
{
prog.Report(i * 10);
System.Threading.Thread.Sleep(200);
}
return DateTime.Now.ToString();
}
Ваши методы на стороне сервера должны быть только async
если они выполняют настоящую асинхронную работу (обычно операции, связанные с вводом / выводом). Как правило, избегайте Task.Run
на стороне сервера.
В вашем JavaScript добавьте следующий метод клиента
var appHub = $.connection.appHub;
$.connection.hub.start();
appHub.client.progress = function(progresspct) {
// logic for whatever you want to do.
};
appHub.server.getServerTime()
.done(function (time) {
alert(time);
});
Измените свой код на стороне сервера к этому -
public async Task<string> GetServerTime(IProgress<int> prog)
{
await Task.Run(() => {
for (int i = 0; i < 10; i++)
{
prog.Report(i * 10);
// Call to your client side method.
Clients.Client(Context.ConnectionId).progress(i);
System.Threading.Thread.Sleep(200);
}
});
return DateTime.Now.ToString();
}