ITnetwork summer 2020 Python týden
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
80 % bodů zdarma na online výuku díky naší Letní akci!

Diskuze: Znouvunačtení BackgroundWorker nefunguje CancelAsync()

Aktivity (4)
Avatar
František Střelka:29. června 9:27

Data položek ze seznamu načítám pomocí BackgroundWorker. Když ale kliknu na jinou položku dříve, než se dokončí načtení předchozí, zobrazí se hláška BackgroundWorker je aktuálně zaneprázdněn a nemůže souběžně zpracovávat více úloh.

Zkusil jsem: V třídě jsem do Public Sub New() tedy přidal:

BackgroundWorkerD.WorkerSupportsCancellation = True

a do samotného výběru ze seznamu jsem před opětovné načtení položek předřadil CancelAsync():

If BackgroundWorkerD.IsBusy() Then
   BackgroundWorkerD.CancelAsync()
End If
BackgroundWorkerD.RunWorkerAsync()

..ale stejná chyba.
Pomohlo vytvořit novou třídu BackgroundWorkerD, ale myslím, že to nejspíše nebude to pravé řešení:

If BackgroundWorkerD.IsBusy() Then
    BackgroundWorkerD.CancelAsync()
    BackgroundWorkerD = Nothing
    BackgroundWorkerD = New ComponentModel.BackgroundWorker
    BackgroundWorkerD.WorkerReportsProgress = True
    BackgroundWorkerD.WorkerSupportsCancellation = True
End If
BackgroundWorkerD.RunWorkerAsync()

Chci docílit: Nemohu přijít na to, proč nefunguje ta první varianta. Díky za radu.

 
Odpovědět
29. června 9:27
Avatar
zelvicek
Člen
Avatar
zelvicek:29. června 11:37

Nedal jsi sem kód zpracovávaného v BackgroundWorker-u, proto mám podezření, že sis nezjistil, co přesně ten CancelAsync dělá. Prosuduj si https://docs.microsoft.com/….cancelasync?…

 
Nahoru Odpovědět
29. června 11:37
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na zelvicek
František Střelka:30. června 4:40

Díky, a budu rád, když mě teď opravíš, jestli to chápu špatně...
Pokud použiji CancelAsync(), operace se nepřeruší okamžitě, ale stále běží, dokud v BackgroundWor­kerD_DoWork nedojde např. k:

If BackgroundWorkerDum.CancellationPending Then
    e.Cancel = True
    Return
End If

...což se tedy ASI nechá použít jen ve chvíli, kdy v _DoWorku je např. nějaký cyklus, kde před každým průchodem ověřím, jestli uživatel nestiskl např. tlačítko "Cancel", nebo je tam více zdlouhavých operací, mezi kterými ověřuji, zda nebyly "zrušeny" uživatelem. Bohužel já tam mám pouze jednu déle trvající operaci, (do níž výše uvedený kód nevložím), a potřebuji, aby výběrem jiné položky z menu nemusel uživatel zbytečně čekat na načtení předchozí a běh bgw se ukončil okamžitě, bez ohledu na to, v jaké je fázi.
Tak mám dojem, že jsem asi nezvolil správný způsob k zastavení bgw. Jdu tedy dál hledat, ale za typ, budu rád.

 
Nahoru Odpovědět
30. června 4:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.