

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Lambda SnapStart 執行時期勾點 (.NET)
<a name="snapstart-runtime-hooks-dotnet"></a>

您可以在 Lambda 建立快照之前或 Lambda 從快照恢復函數之後，使用執行階段掛鉤來實作程式碼。[Amazon.Lambda.Core](https://www.nuget.org/packages/Amazon.Lambda.Core) 套件 (2.5.0 版或更新版本) 提供 .NET 執行時期勾點。此程式庫提供兩種定義執行時期勾點的方法：
+ `RegisterBeforeSnapshot()`：建立快照前執行的程式碼
+ `RegisterAfterSnapshot()`：從快照恢復函數後執行的程式碼

**注意**  
如果使用的是[適用於 .NET 的 Lambda Annotations 架構](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
        };
    }
}
```