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

Diskusia: Znouvunačtení BackgroundWorker nefunguje CancelAsync()

Aktivity (4)
Avatar
František Střelka:29. júna 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.

Skúsil som: 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()

Chcem docieliť: Nemohu přijít na to, proč nefunguje ta první varianta. Díky za radu.

 
Odpovedať
29. júna 9:27
Avatar
zelvicek
Člen
Avatar
zelvicek:29. júna 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?…

 
Hore Odpovedať
29. júna 11:37
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Odpovedá na zelvicek
František Střelka:30. júna 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.

 
Hore Odpovedať
30. júna 4:40
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 3 správy z 3.