public async Task SubscribeToChunk(ChunkKey key) { if (Subscriptions.ContainsKey(key)) { return; } var channel = OutgoingChannel;//copy to local for closure; var chunkHandlerSubscription = await BattleHandler.GetChunkHandlerAndSubscribeAsync(key, (chunkKey, update) => OnChunkUpdateAsync(key, update, channel)); if (Subscriptions.TryAdd(key, chunkHandlerSubscription)) { await SendChunkStateAsync(key, chunkHandlerSubscription); } else { chunkHandlerSubscription.Dispose(); throw new InvalidOperationException("Duplicate subscription is detected."); } }