Sae*_*med 5 c# asp.net-mvc websocket signalr signalr-hub
我有一个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();
}
Run Code Online (Sandbox Code Playgroud)
我尝试调用这样的方法:
var appHub = $.connection.appHub;
$.connection.hub.start();
appHub.server.getServerTime()
.done(function (time) {
alert(time);
});
Run Code Online (Sandbox Code Playgroud)
但我不知道如何获得进度报告.
Ste*_*ary 11
您可以这样使用progress:
var appHub = $.connection.appHub;
$.connection.hub.start().done(function() {
appHub.server.getServerTime()
.progress(function (update) { alert(update); })
.done(function (time) { alert(time); });
});
Run Code Online (Sandbox Code Playgroud)
另外,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();
}
Run Code Online (Sandbox Code Playgroud)
您的服务器端方法应该只有在async他们有真正的异步工作时才进行(通常是I/O绑定操作).作为一般规则,请避免Task.Run在服务器端.
| 归档时间: |
|
| 查看次数: |
5061 次 |
| 最近记录: |