RU CSharp Concurrency - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Потоки, задачи и синхронизация
Асинхронность позволяет ожидать, конкурентность — обслуживать несколько работ, параллелизм — выполнять их одновременно. 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.