RU CSharp Concurrency - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

Українська · Русский · 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.