Repository navigation
CSharp Concurrency
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Асинхронність дозволяє очікувати, конкурентність — обслуговувати кілька завдань, паралелізм — виконувати їх одночасно. Task.Run підходить для обчислень; сам собою він не робить ігрові об’єкти безпечними для доступу з різних потоків. UI та ігровий світ слід обслуговувати через передбачений API хоста.
Збережіть цей приклад окремо як 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.
ClassicUO — Bad Newbie & C# Scripts IDE