Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
Delphi 10 Seattle Enterprise
|
AW: Problem: Mehrere Threads auf ein Dictionary
11. Mai 2015, 16:20
Warum solltest du den Task nicht abbrechen können? Du solltest den auf jeden Fall abbrechen und den gesamten Ablauf etwas anders aufbauen:
Delphi-Quellcode:
procedure TTeItemInfo.AddSmallDataFromListAsync(list: TList<TeItemDB.TTeItemDBData>; lang: TTeLanguage);
var
LList : TArray<TeItemDB.TTeItemDBData>;
LIdx : Integer;
begin
// Wenn es einen Task gibt
if Assigned( FEs ) then
// dann brechen wir den mal ab
FEs.Cancel;
// Wir prüfen schon vorher, welche Items abgearbeitet werden müssen
for LIdx := 0 to list.Count - 1 do
if not smalldata.ContainsKey(list[LIdx].id) then
LList := LList + [ list[LIdx] ];
FEs := TTask.Create( procedure()
var
i: Integer;
s: String;
begin
for i := Low( LList ) to High( LList ) do
begin
// Prüfen ob dieser Task abgebrochen wurde
TTask.CurrentTask.CheckCanceled; // wirft eine Exception, wenn abgebrochen
s := DownloadInfo(LList[i].id, lang.LoadedLanguage);
TThread.Synchronize( nil, procedure
begin
// wir müssen nochmal prüfen,
// denn es könnten parallel Einträge hinzugekommen sein
if not smalldata.ContainsKey(LList[i].id) then
AddSmallInfo(s,list[i].id,lang);
end );
end;
// Synchronisierter Zugriff
TThread.Synchronize( nil, procedure
begin
if Assigned(FOnUpdate) then FOnUpdate(self);
end );
end);
FEs.Start;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
Geändert von Sir Rufo (11. Mai 2015 um 17:13 Uhr)
|