{"id":10232,"date":"2026-07-17T11:40:51","date_gmt":"2026-07-17T10:40:51","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=10232"},"modified":"2026-07-17T11:40:52","modified_gmt":"2026-07-17T10:40:52","slug":"c-errortracker","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-errortracker\/","title":{"rendered":"C# ErrorTracker"},"content":{"rendered":"\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">using System;\nusing System.Collections.Concurrent;\n\npublic sealed record ErrorState(\n    int ErrorCount,\n    DateTime LastError,\n    DateTime SkipUntil);\n\npublic sealed class ErrorTracker\n{\n    private readonly ConcurrentDictionary&lt;string, ErrorState> _errors = new();\n\n    public bool ShouldSkip(string id)\n    {\n        return _errors.TryGetValue(id, out var state) &amp;&amp; state.SkipUntil > DateTime.UtcNow;\n    }\n\n    public void RegisterError(string id)\n    {\n        _errors.AddOrUpdate(\n            id,\n            _ => CreateState(1),\n            (_, existing) => CreateState(existing.ErrorCount + 1));\n    }\n\n    public void RegisterSuccess(string id)\n    {\n        _errors.TryRemove(id, out _);\n    }\n\n    public ErrorState? GetState(string id)\n    {\n        return _errors.TryGetValue(id, out var state) ? state : null;\n    }\n\n    private static ErrorState CreateState(int errorCount)\n    {\n        var now = DateTime.UtcNow;\n\n        var backoff = errorCount switch\n        {\n            1 => TimeSpan.FromMinutes(5),\n            2 => TimeSpan.FromMinutes(30),\n            3 => TimeSpan.FromHours(2),\n            _ => TimeSpan.FromHours(24)\n        };\n\n        return new ErrorState(\n            ErrorCount: errorCount,\n            LastError: now,\n            SkipUntil: now.Add(backoff));\n    }\n}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Usage example<\/strong><\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">if (errorTracker.ShouldSkip(item.Id))\n{\n    Console.WriteLine($\"Item {item.Id} wordt overgeslagen.\");\n    return;\n}\n\ntry\n{\n    await SynchronizeAsync(item);\n\n    errorTracker.RegisterSuccess(item.Id);\n}\ncatch (Exception ex)\n{\n    errorTracker.RegisterError(item.Id);\n\n    var state = errorTracker.GetState(item.Id);\n\n    Console.WriteLine(\n        $\"Synchronisatie mislukt voor {item.Id}. \" +\n        $\"Aantal fouten: {state?.ErrorCount}, \" +\n        $\"Opnieuw proberen na: {state?.SkipUntil:u}\");\n}<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Usage example<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-10232","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/10232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=10232"}],"version-history":[{"count":1,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/10232\/revisions"}],"predecessor-version":[{"id":10233,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/10232\/revisions\/10233"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=10232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=10232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=10232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}