Skip to content

CSharp Concurrency

Codex edited this page Oct 11, 2026 · 2 revisions

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Потоки, завдання та синхронізація

Посібник C# · Приклади UO

Асинхронність дозволяє очікувати, конкурентність — обслуговувати кілька завдань, паралелізм — виконувати їх одночасно. Task.Run підходить для обчислень; сам собою він не робить ігрові об’єкти безпечними для доступу з різних потоків. UI та ігровий світ слід обслуговувати через передбачений API хоста.

Простий приклад (Example.cs)

Збережіть цей приклад окремо як Example.cs. Запускайте його незалежно від інших прикладів на сторінці.

Example.cs:

// PROJECT-EXAMPLE
int count = 0;
System.Threading.Tasks.Parallel.For(0, 3, _ => System.Threading.Interlocked.Increment(ref count));
System.Console.WriteLine(count);

Результат:

3
int total = await Task.Run(() => Enumerable.Range(1, 100).Sum(), Cancellation);
UO.Print(total.ToString());
using System.Collections.Concurrent;
var values = new ConcurrentDictionary<string, int>();
values.TryAdd("items", 1);
values.AddOrUpdate("items", 1, (_, old) => old + 1);
UO.Print(values["items"].ToString());

lock захищає синхронну ділянку, SemaphoreSlim.WaitAsync — асинхронне очікування доступу, Interlocked — окремі атомарні операції. Не тримайте блокування під час тривалої зовнішньої роботи та не запускайте забуті завдання, які звертаються до сесії після завершення сценарію.

Офіційна документація: Потоки, завдання та синхронізація – Microsoft Learn.

Clone this wiki locally