

# 适用于 .NET 的 Lambda SnapStart 运行时钩子
<a name="snapstart-runtime-hooks-dotnet"></a>

在 Lambda 创建快照之前或在 Lambda 从快照恢复函数之后，使用运行时钩子实施代码。.NET 运行时钩子作为 [Amazon.Lambda.Core](https://www.nuget.org/packages/Amazon.Lambda.Core) 程序包（2.5.0 版或更高版本）的一部分提供。此库提供了两种可用于定义运行时钩子的方法：
+ `RegisterBeforeSnapshot()`：创建快照之前运行的代码
+ `RegisterAfterSnapshot()`：从快照恢复函数之后运行的代码

**注意**  
如果您使用的是[适用于.NET 的 Lambda 注释框架](csharp-handler.md#csharp-handler-annotations)，则请升级到 [Amazon.Lambda.Annotations](https://www.nuget.org/packages/Amazon.Lambda.Annotations) 1.6.0 版或更高版本，以确保与 SnapStart 兼容。

## 运行时钩子注册和执行
<a name="runtime-hooks-registration-dotnet"></a>

在初始化代码中注册钩子。根据 Lambda 函数的[执行模型](csharp-handler.md#csharp-handler-setup)，请考虑以下指南：
+ 对于[可执行程序集方法](csharp-handler.md#csharp-executable-assembly-handlers)，请在使用 `RunAsync` 启动 Lambda 引导程序之前注册钩子。
+ 对于[类库方法](csharp-handler.md#csharp-class-library-handlers)，请在处理程序类构造函数中注册钩子。
+ 对于 [ASP.NET Core 应用程序](csharp-package-asp.md)，请在调用 `WebApplications.Run` 方法之前注册钩子。

要在 .NET 中注册 SnapStart 的运行时钩子，请使用以下方法：

```
Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint);
Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterCheckpoint);
```

注册多个钩子类型时，Lambda 执行运行时钩子的顺序由注册顺序决定：
+ `RegisterBeforeSnapshot()`：按注册的相反顺序执行
+ `RegisterAfterSnapshot()`：按注册的顺序执行

**注意**  
Lambda 创建快照时，初始化代码最多可以运行 15 分钟。时间限制为 130 秒或[配置的函数超时](configuration-timeout.md)（最大 900 秒），以较高者为准。您的 `RegisterBeforeSnapshot()` 运行时挂钩计入初始化代码时限。Lambda 还原快照时，运行时必须加载，并且 `RegisterAfterSnapshot()` 运行时钩子必须在超时限制（10 秒）内完成。否则，您将收到 SnapStartTimeoutException。

## 示例
<a name="runtime-hooks-dotnet-code-sample"></a>

以下示例函数介绍如何在检查点检查（`RegisterBeforeSnapshot`）之前和还原（`RegisterAfterRestore`）之后运行代码。

```
public class SampleClass
{
    public SampleClass()
    {
        Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint);
        Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterCheckpoint);
    }

    private ValueTask BeforeCheckpoint()
    {
        // Add logic to be executed before taking the snapshot
        return ValueTask.CompletedTask;
    }

    private ValueTask AfterCheckpoint()
    {
        // Add logic to be executed after restoring the snapshot
        return ValueTask.CompletedTask;
    }

    public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // Add business logic

        return new APIGatewayProxyResponse
        {
            StatusCode = 200
        };
    }
}
```