Part of #753.
Goal
Migrate the HistoricalAccess Workshop server sample to AsyncCustomNodeManager, including its historian read/update paths. It builds its address space by hand (no generated model), so Step 2 (Fluent) does not apply.
Scope
Workshop/HistoricalAccess/Server/HistoricalAccessNodeManager.cs — HistoricalAccessServerNodeManager : CustomNodeManager2
Workshop/HistoricalAccess/Server/HistoricalAccess Server.csproj and its node-manager registration
- Related history helper types under
Workshop/HistoricalAccess/Server
Do not touch the client or the Tester project.
Step 1 — AsyncCustomNodeManager
- Base class
CustomNodeManager2 → AsyncCustomNodeManager; constructor base(server, configuration, <namespaceUri>).
CreateAddressSpace → override async ValueTask CreateAddressSpaceAsync(...); LoadPredefinedNodes → LoadPredefinedNodesAsync.
- Convert history handling to the async history interfaces:
IHistoryReadAsyncNodeManager / IHistoryUpdateAsyncNodeManager (raw data, modified, processed/aggregate reads, and history update/delete). Convert read/write callbacks to async handlers.
- Remove
lock (Lock) blocks — use base async locking.
- Register via
IAsyncNodeManagerFactory.
Acceptance criteria
HistoricalAccessServerNodeManager derives from AsyncCustomNodeManager; history read/update goes through the async interfaces; no CustomNodeManager2 / lock (Lock) remains.
- HistoricalAccess Server builds/starts; the client performs raw/processed history reads and history updates successfully.
References
docs/AsyncServerSupport.md (UA-.NETStandard) — async history-read/update interfaces.
Part of #753.
Goal
Migrate the HistoricalAccess Workshop server sample to
AsyncCustomNodeManager, including its historian read/update paths. It builds its address space by hand (no generated model), so Step 2 (Fluent) does not apply.Scope
Workshop/HistoricalAccess/Server/HistoricalAccessNodeManager.cs—HistoricalAccessServerNodeManager : CustomNodeManager2Workshop/HistoricalAccess/Server/HistoricalAccess Server.csprojand its node-manager registrationWorkshop/HistoricalAccess/ServerDo not touch the client or the Tester project.
Step 1 — AsyncCustomNodeManager
CustomNodeManager2→AsyncCustomNodeManager; constructorbase(server, configuration, <namespaceUri>).CreateAddressSpace→override async ValueTask CreateAddressSpaceAsync(...);LoadPredefinedNodes→LoadPredefinedNodesAsync.IHistoryReadAsyncNodeManager/IHistoryUpdateAsyncNodeManager(raw data, modified, processed/aggregate reads, and history update/delete). Convert read/write callbacks to async handlers.lock (Lock)blocks — use base async locking.IAsyncNodeManagerFactory.Acceptance criteria
HistoricalAccessServerNodeManagerderives fromAsyncCustomNodeManager; history read/update goes through the async interfaces; noCustomNodeManager2/lock (Lock)remains.References
docs/AsyncServerSupport.md(UA-.NETStandard) — async history-read/update interfaces.