我有一个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);
});
但是我不知道怎样才能得到进度报告。
您可以使用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
而不是CPU绑定的代码是没有意义的。您的服务器端代码可以很容易地是:
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();
}
只有当服务器端方法有真正的异步工作要做(通常是I/O绑定操作)时,它们才应该是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();
}