Ist Thread sicher? Es scheint, dass die Task-Klasse threadsicher ist, also denke ich, dass es auch Thread-sicher ist, aber ich habe nirgends eine Bestätigung gefunden. Auch Thread-Sicherheit ist eine Voraussetzung für benutzerdefinierte Warter - ich meine für die IsCompleted, GetAwaiter, etc. Methoden? I.e. Wenn diese Methoden nicht threadsicher sind, wird es threadsicher sein? Ich erwarte jedoch nicht, dass ich bald einen benutzerdefinierten Warter brauche.Ist es in Ordnung, die gleiche Aufgabe von mehreren Threads zu erwarten - ist Thread sicher?
Ein Beispiel für Benutzerszenario: Lassen Sie uns sagen, dass ich eine Hintergrundaufgabe haben, die asynchron ein Ergebnis zurückgibt, die dann von mehreren Threads verwendet wird:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace scratch1
{
class Foo
{
Task<int> _task;
public Foo()
{
_task = Task.Run(async() => { await Task.Delay(5000); return 5; });
}
// Called from multiple threads
public async Task<int> Bar(int i)
{
return (await _task) + i;
}
}
class Program
{
public static void Main(string[] args)
{
Foo foo = new Foo();
List<Task> tasks = new List<Task>();
foreach (var i in Enumerable.Range(0, 100))
{
tasks.Add(Task.Run(async() => { Console.WriteLine(await foo.Bar(i)); }));
}
Task.WaitAll(tasks.ToArray());
}
}
}
Ihre erste Aussage kann Leute in die Irre führen, dass "erwarten" grundsätzlich unsicher ist ... wohingegen ich denke, dass Sie weder von Natur aus sicher noch unsicher sind - es delegiert nur an das, was erwartet, und wenn das 'Aufgabe' ist, in Ordnung. –
@JonSkeet: Guter Punkt. Ist das besser? – SLaks
Definitiv, danke. Obwohl "wird immer nur auf einem Thread laufen" sollte wahrscheinlich "wird immer nur auf einen Thread zu einem Zeitpunkt pro Methode aufrufen (was einer einzigen Instanz der State Machine entspricht)". Es kann durchaus zwischen Threads an 'have' Punkten hin- und herspringen, aber es wird nicht gleichzeitig auf mehreren Threads laufen. (Zumindest nicht, wenn du es fürchterlich missbrauchst ... was immer Spaß macht.) –