如何从连接到 singnalr 服务的 azure 函数调用异步方法,为什么 IAsyncCollector 用于 return

How to call async methods from a azure function connected to a singnalr service why IAsyncCollector is used for return

我有一个连接到 singnalr 服务的 azure 函数,这就是为什么使用 IAsyncCollector 参数通过 AddAsync 添加 return。现在我必须调用一个异步方法来计算结果,但是我需要将方法签名更改为异步,然后我还必须将结果更改为在运行时不起作用的任务。

[FunctionName("Join")]
public static async Task<Task> Join(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post")] JoinRequest message,
            [SignalR(HubName = "chat")] IAsyncCollector<SignalRMessage> signalRMessages)
{
    await MyHelper.Instance.FillAsync(message);           
    return signalRMessages.AddAsync(
        new SignalRMessage
                {
                    Target = "joined",
                    Arguments = new[] { message }
                });
}

我了解了 IAsyncCollector 收集器的工作原理,因此 awaitig AddAsync 毫无意义。但是我如何调用该异步方法或使 IAsyncCollector 在异步方法中工作。我并没有真正找到一些示例,这可能是如何工作的。 ms doc 中有一些示例,但它们没有 return 或不使用异步。

AddAsync 是一种 Task returning 方法。由于您的函数已经是 async,因此您应该 await 计算值。

您的函数当前的编写方式是 returnTask<Task>。 azure function runtime 会等待 outer 任务,但基本上会丢弃 inner 任务。该外部任务几乎立即完成,因为它唯一的工作就是创建另一个任务。这意味着来自 AddAsync 操作的 Task return 将被丢弃,并且可能在基础结构调用收集器上的 Flush 之前尚未完成。因此,这将导致收集的价值丢失。

我不确定为什么您认为您不应该 await 该方法。我怀疑你因为这个假设而最终得到了 Task<Task> return 类型*。

实现这个的正确方法是让你的函数 return 成为 Task 并且 await 调用 AddAsync

// returns Task not Task<Task>
[FunctionName("Join")]
public static async Task Join(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post")] JoinRequest message,
            [SignalR(HubName = "chat")] IAsyncCollector<SignalRMessage> signalRMessages)
{
    await MyHelper.Instance.FillAsync(message)
    // no return, await the call       
    await signalRMessages.AddAsync(
        new SignalRMessage
                {
                    Target = "joined",
                    Arguments = new[] { message }
                });
}

* 与您 开始 相比,return 类型 Task<Task> 已经选择,并且确定实现这一目标的唯一方法是 return 来自 AddAsyncTask 没有 await