IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
František Střelka:29.6.2020 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.6.2020 9:27
Avatar
zelvicek
Člen
Avatar
zelvicek:29.6.2020 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.6.2020 11:37
Avatar
Odpovídá na zelvicek
František Střelka:30.6.2020 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.6.2020 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.