我正在努力转向无服务器的事情,我发现自己不了解如何移植现有的后端代码。我需要澄清以下假设:
static
成员的开销是多少?
基本上,我们在AppDomain
一生中有任何保证吗?是否可以设置DI容器,以便将我的依赖项注入Run
方法?这样的事情:
[FunctionName("ServiceBusQueueTriggerCSharp")]
public async Task RunAsync(
[ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "meconn")]
string myQueueItem,
IBusinessLogicService blService,
ILogService logService,
IMailingService mailService) {
}
是否可以在CancellationToken
方法中获得Run
,以便我可以优雅地取消/关闭?
答案 0 :(得分:4)
这取决于“单线程代码”的含义。在较高的层次上,您应该查看在函数中编写的代码,类似于在ASP.NET MVC控制器方法中编写代码的方式。发生单个事件(例如HTTP请求),运行应用程序的特定计算机已收到该事件,您的代码描述了如何处理它。 Azure Functions的动态扩展功能永远不会执行单个执行,并透明地将执行分配到多个线程或计算机上。如果您的场景需要根据单个事件完成大量工作,那么您应该将工作分成多个功能,以便系统可以将其扩展。最简单的方法之一是使用队列。
在许多情况下,使用TPL是有效的。例如,您的函数可能从3个不同的数据源中提取数据并将其合并为一个结果。在这种情况下,并行启动这3个异步操作是有意义的。我对PLINQ不太确定。我要说的是,当你有大量的计算需要并行发生以达到效率时,你最好将这些计算分成单独的函数执行(例如使用我上面提到的队列)。
您可以使用基本没有开销的静态变量,但不能保证应用程序域的生命周期。因此,您需要准备好在需要时重新初始化这些变量。
Azure功能当前未公开每个功能内存使用情况统计信息。功能应用级别有使用情况统计信息,有关信息,请参阅here。
Azure功能目前不支持DI。
是的,只需将您的函数定义为异步函数,该函数返回一个任务并让它接受一个取消令牌,一个将传递给您。