【问题标题】:How to return a Task?如何返回任务?
【发布时间】:2020-10-05 02:51:27
【问题描述】:

我正在学习 Websocket:https://radu-matei.com/blog/aspnet-core-websockets-middleware/ 我如何从下面的任务返回?

public override Task ReceiveAsync(WebSocket socket, WebSocketReceiveResult result, byte[] buffer)
    {
        string message = "Replied by: " + cn.GetId(socket);

        Task.Run(async () =>
        {
            await socket.SendAsync(buffer: new ArraySegment<byte>(array: Encoding.ASCII.GetBytes(message),
                                                                 offset: 0,
                                                                 count: message.Length),
                                  messageType: WebSocketMessageType.Text,
                                  endOfMessage: true,
                                  cancellationToken: CancellationToken.None);


        });
    }

我得到:严重性代码描述项目文件行抑制状态 错误 CS0161 'NotificationsMessageHandler.ReceiveAsync(WebSocket, WebSocketReceiveResult, byte[])': 并非所有代码路径都返回值

我不知道如何返回任务..

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    您不需要明确地使用 Task.Run,​​而不是

    Task.Run(async () =>
        {
            await socket.SendAsync(buffer: new ArraySegment<byte>(array: Encoding.ASCII.GetBytes(message),
                                                                 offset: 0,
                                                                 count: message.Length),
                                  messageType: WebSocketMessageType.Text,
                                  endOfMessage: true,
                                  cancellationToken: CancellationToken.None);
    
    
        });
    

    你可以使用

    await socket.SendAsync(buffer: new ArraySegment<byte>(array: Encoding.ASCII.GetBytes(message),
                                                             offset: 0,
                                                             count: message.Length),
                              messageType: WebSocketMessageType.Text,
                              endOfMessage: true,
                              cancellationToken: CancellationToken.None);
    

    在这里,await 将返回我假设是异步的 socket.SendAsync 的结果

    【讨论】:

    • 我收到错误:NotificationsMessageHandler.ReceiveAsync(WebSocket, WebSocketReceiveResult, byte[])': 并非所有代码路径都返回值
    • +1:您还应该提到 not 使用 Task.Run 具有不同的行为,因为它 Task.Run 安排工作在其上运行另一个线程。在问题的上下文中,绝对不需要Task.Run
    • @DevDon,使用返回等待
    • 不能使用return await,因为方法不是async
    • @John,从方法名称 SendAsync 判断,我假设它是异步的,而 ReceiveAsync 应该是异步的,谢谢提及。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多