ここでできることがいくつかあります。1 つ目は、タイマーを使用して標準レートで更新を行うことです。Windows フォームを使用している場合は、Timer コンポーネントをフォームにドロップして、期間を 15 ミリ秒に設定できます。これにより、1 秒あたり (約) 66 フレームの更新が行われます。
.NET タイマーでは、せいぜい約 15 ミリ秒の分解能しか得られないことに注意してください。Windows タイマーのいずれかを独自に実装して 1 ミリ秒の精度を実現できますが、そうするとコードが非常に複雑になります。
他にできることは、CurrentFrame画像を更新するコードに update メソッドを呼び出してもらい、その update メソッドを一定の設定レートよりも頻繁に更新しないようにすることです。これを行うには、プログラムの先頭で aStopwatchを開始し、最後の更新からの経過時間を確認します。何かのようなもの:
private Stopwatch FrameTimer = Stopwatch.StartNew();
private long LastUpdateTime = 0;
private const long MinUpdateMs = 10; // minimum time between updates
void DoUpdate()
{
    long currentTime = FrameTimer.ElapsedMilliseconds;
    if ((currentTime - LastUpdateTime) < MinUpdateMs)
    {
        // updated within the last 10 ms
        return;
    }
    LastUpdateTime = currentTime;
    if (CurrentFrame != null)
    {
        g.DrawImageUnscaled(CurrentFrame, 0,0);
    }
}
2 番目のオプションは非常に効果的ですが、継続的な変更がない場合、最後の更新を取得できないリスクがあります。の更新間隔が長くなる可能性がある場合CurrentFrameは、約 1 秒ごとに更新を強制するタイマーを設定できます。その場合は、DoUpdateメソッドに同期を追加して、同時更新を防止します。私は提案します:
private object UpdateLock = new object();
void DoUpdate()
{
    if (!Monitor.TryEnter(UpdateLock))
    {
        // update already in progress
        return;
    }
    try
    {
        long currentTime = FrameTimer.ElapsedMilliseconds;
        if ((currentTime - LastUpdateTime) < MinUpdateMs)
        {
            // updated within the last 10 ms
            return;
        }
        LastUpdateTime = currentTime;
        if (CurrentFrame != null)
        {
            g.DrawImageUnscaled(CurrentFrame, 0,0);
        }
    }
    finally
    {
        Monitor.Exit(UpdateLock);
    }
}