c# - 使用 SignalR 和 IProgress 接口(interface)的进度报告

标签 c# asp.net-mvc websocket signalr signalr-hub

我有一个 Hub 类,它有一个长时间运行的方法,我需要在它工作时显示一个进度条。

我读了this article我认为可以在异步方法中使用 IProgress 接口(interface)来发送长时间运行的操作状态。

我写了这样一个方法:

    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);
               });

但是我不知道怎样才能得到进度报告。

最佳答案

您可以 use progress ,因此:

var appHub = $.connection.appHub;
$.connection.hub.start().done(function() {
  appHub.server.getServerTime()
    .progress(function (update) { alert(update); })
    .done(function (time) { alert(time); });
});

附带说明一下,在服务器端对 CPU 绑定(bind)代码使用 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();
}

如果服务器端方法有真正的异步工作要做(通常是 I/O 绑定(bind)操作),则它们应该只async。作为一般规则,避免在服务器端使用 Task.Run

关于c# - 使用 SignalR 和 IProgress 接口(interface)的进度报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40110868/

相关文章:

c# - 我不明白 C# get 的用法;放;似乎与Java不同

javascript - 使用 Kendo MVC 上传控件将 Javascript/html 变量作为参数传递

asp.net - 如何准备 Controller 以使用 Session 但可测试?

java - 使用 Jetty Websocket 客户端时如何抑制日志输出到标准输出?

java - 是否可以通过 Spring WebSocket 发送同步消息?

c# - 如何使用 NuGet 包添加对 Visual 项目的引用?

c# - Visual Studio 2010 的硬件

c# - Marshal.AllocHGlobal 正在分配比预期更多的内存

asp.net-mvc - 在父 View 顶部的 Jquery 模式弹出窗口中渲染部分 View

javascript - 如何使用socket.io从客户端创建多个websocket连接?