Ich habe einmal ein kleines Beispiel erstellt, siehe Anhang.
Sehr schönes Beispiel
Ich frage mich, weil es eine globale Funktion ist, welche von allen Seiten aus angefragt werden könnte,
ob es nicht threadsicherer würde, wenn man die Parameter klonen würde?
Also hier
Delphi-Quellcode:
class procedure TUrlChecker.Check( const AUrlList : TStrings;
const AStatusCallback : TStatusCallback;
ThreadCount : Integer;
const AOnFinished : TFinishedCallback );
var
LUrlList : TStringList;
begin
LUrlList : TStringList.Create; // Better clone, to ensure higher threadsafety??
LUrlList.AddStrings( AUrlList );
TTask.Run(
procedure
var
WorkQueue : TThreadedQueue< NativeUInt >;
Tasks : TArray<ITask>;
I : Integer;
begin
// Intern nur die Kopie LUrlList, statt AUrlList verwenden
if not Assigned( LUrlList ) or not Assigned( AStatusCallback ) then
Exit;
...
Ich habe bei der direkten Nutzung von Parametern wie AUrlList über zwei anonyme Funktionen hinweg immer so meine Bauchschmerzen, ob sich da drin zwischendurch nicht doch was verändert hat.
In der Praxis wird es wohl 100% ausreichen, weil man so eine Funktion ja nur an einer bestimmten Stelle nutzt, die man gut beobachten kann, normalerweise.
Aber falls nicht, dann "better safe than sorry", solche Fehler sind wohl schwer zu finden.
Oder gibt es gute Gründe dafür, dass ich mir hier zu viele Sorgen wegen der Parameter mache