如何从连接到 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 来自 AddAsync
的 Task
没有 await
。
我有一个连接到 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 来自 AddAsync
的 Task
没有 await
。