IT CSharp Concurrency - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Discussioni, attività e sincronizzazione
L'asincronia ti permette di aspettare, la concorrenza ti permette di svolgere più lavori, il parallelismo ti permette di eseguirli contemporaneamente. Task.Run adatto per lavori computazionali; di per sé non rende gli oggetti di gioco thread-safe. UI e il mondo di gioco devono essere serviti dall'host API fornito.
Esempio semplice (Example.cs)
Salvare questo esempio separatamente come Example.cs. Eseguirlo indipendentemente dagli altri esempi di questa pagina.
Example.cs:
// PROJECT-EXAMPLE
int count = 0;
System.Threading.Tasks.Parallel.For(0, 3, _ => System.Threading.Interlocked.Increment(ref count));
System.Console.WriteLine(count);
Risultato:
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 protegge la sezione sincrona, SemaphoreSlim.WaitAsync - attesa asincrona per l'accesso, Interlocked - operazioni atomiche individuali. Non mantenere un blocco durante un lungo lavoro esterno e non eseguire attività dimenticate accedendo alla sessione dopo il completamento dello script.
Documentazione ufficiale: Thread, attività e sincronizzazione - Microsoft Learn.