[Vb.net 2010] Aiuto background worked

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
32
sevenjeak.altervista.org
Premetto che non uso spesso il BackgroundWorked, ma sto provando, per un'altro mio programma, ad aggiornare, ogni secondo, la proprietà Text del form, con la data corrente, oltre a questo ho inserito alla chiusura del programma che: viene interrotto il lavoro in background e che lo stesso programma non viene chiuso ( solamente per ora ), il codice è questo:

Codice:
Private Sub mainForm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        BackgroundWorker1.CancelAsync()
        e.Cancel = True
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        BackgroundWorker1.WorkerReportsProgress = True
        BackgroundWorker1.WorkerSupportsCancellation = True
        Dim i As Integer = 0

        While True
            System.Threading.Thread.Sleep(1)
            BackgroundWorker1.ReportProgress(i)

            If BackgroundWorker1.CancellationPending = True Then
                e.Cancel = True
            Else
                i += 1
            End If
        End While
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        Me.Text = Now
    End Sub

Ora questo codice, mi deve visualizzare, nel titolo del form, l'ora in tempo reale, e fino qui tutto ok, ma, quando chiudo il form, il lavoro in background mi continua ( mi mostra sempre l'orario corrente, senza fermarsi ), sbaglio qualcosa io?
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
Prova a fare questo:

BackgroundWorker1.WorkerSupportsCancellation = true;
BackgroundWorker1.CancelAsync();
BackgroundWorker1.Dispose();
BackgroundWorker1= null;
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
32
sevenjeak.altervista.org
Il WorkerSupportsCancellation = true; lo inserito nell'evento doWork(), cmq ho provato a scrivere cosi:

Codice:
BackgroundWorker1.CancelAsync()
        BackgroundWorker1.Dispose()
        BackgroundWorker1 = Nothing
        e.Cancel = True

Ma non funziona lo stesso, ora mi restituisce un NullReferenceException nell'evento doWork() nella linea, backgroundWorker1.reportProgress(i), credo che me lo faccia perché ho impostato a Nothing il backgroundWorker, mi restituisce questa eccezione: Object reference not set to an instance of an object.
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
E tu non puoi controllare che backgroundWorker1.reportProgress(i) sia diverso da null e in caso negativo non fare eseguire il codice?
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
Si, una soluzione potrebbe essere questa.

Ma perchè il programma non deve essere chiuso?
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
32
sevenjeak.altervista.org
Non c'è nessun motivo, quell''istruzione, e.cancel = true, che ovviamente non permette la chiudere il programma, lo messa solamente per verificare che l'istruzione sopra, che fermano il lavoro in background, venissero eseguite correttamente, solo per quello non faccio chiudere il programma, solo per verificare questo, infatti una volta che riesco il programma lo faccio chiudere.

Ora sto provando a modificare il codice come hai detto te, ti farò sapere.
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
32
sevenjeak.altervista.org
Scusate se uppo ma non posso editare il mio precedente messaggio, cmq ho provato a modificare il while cosi:

Codice:
while BackgroundWorker1.ReportProgress(i) = Nullable

Ma mi segna sia BackgroundWorker1.ReportProgress(i) che Nullable in rosso.

Per ora sto provando a cercare la soluzione su internet ma non saprei come fare.
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
In tutti gli esempi che troverai vedrai che viene indicato il metodo CancelAsync() per terminare l'elaborazione.

Quello che succede a te dipende probabilmente dall'operazione di annullamento della chiusura del form, cioè l'e.cancel = true annulla pure la terminazione del backgroundworker.

Pertanto chiudendo il form tutto dovrebbe funzionare.
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
32
sevenjeak.altervista.org
Guardando su internet mi sono ricordato del metodo CancellationPending, che verifica se è stato chiamato il metodo di CancelAsyns(), il metodo e.cancel = true non centra niente, il quando fa riferimento all'evento di chiusura del form, infatti, modificando il codice cosi:

Codice:
    Private Sub mainForm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        BackgroundWorker1.CancelAsync()
        e.Cancel = True
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i As Integer = 0

        While BackgroundWorker1.CancellationPending <> True
            System.Threading.Thread.Sleep(1)

            BackgroundWorker1.ReportProgress(i)
            i += 1
        End While
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        Me.Text = Now
    End Sub

Il codice funziona correttamente, ora posso anche togliere l'annullamento della chiusura, grazie per l'aiuto.
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
Io non ho detto che l' e.cancel = true c'entrasse direttamente con il backgroundworker, intendevo che annullando la chiusura del form alcune risorse potevano non essere rilasciate e dare problemi.

Se hai risolto così va bene, comunque anche controllare se BackgroundWorker1.ReportProgress(i) non ha valore nullo è una soluzione.
 
Discussioni simili
Autore Titolo Forum Risposte Data
Sevenjeak [Vb.net 2010] Aiuto creazione tack manager personalizzato .NET Framework 4
E [ASP.Net] Access 2016 ? Non si usa Microsoft Jet 4.0 ma Engine 2016 o 2010. Non va ! ASP.NET 2
A errore http://datatables.net/tn/7 PHP 4
L C# e net 5 GUI .NET Framework 1
felino ASP.net MVC: Exception e chiamata AJAX ASP.NET 1
P Visual Studio VB.NET Visualizzare un messaggio alla scadenza. .NET Framework 0
R Sviluppatore ASP.NET Offerte e Richieste di Lavoro e/o Collaborazione 0
P Passagio dati complessi tra una ASP.NET webapi e Angular ASP.NET 1
A [ASP.Net] Gestire il profilo ADMIN in un progetto ASP NET e pattern MVC ASP.NET 0
P [ASP.Net] Problema ERR_INCOMPLETE_CHUNKED_ENCODING 206 (Partial Content) con Font ASP.NET 4
A Mantenere la validazione reindirizzandoci su un secondo sito WEb. (ASP.NET) ASP.NET 0
StephenSoftware [ASP.Net] Pagina Master ed eventi... ASP.NET 0
StephenSoftware [Visual Basic] Da VB6 a VB.NET Visual Basic 0
F [OFFRO] [RETRIBUITO] PROGRAMMATORE DOT NET Offerte e Richieste di Lavoro e/o Collaborazione 2
NuviaSoftware [Retribuito] [Cerco] Programmatore ambienti ASP.NET,. Net Azure web apps, Javascript Offerte e Richieste di Lavoro e/o Collaborazione 0
V [ASP.Net] avento keydown crh13 enter ASP.NET 0
A [ASP.Net] Dropdownlist ASP.NET 0
S [ASP.Net] [ASP] Upload Image ASP.NET 6
A Errore NET::ERR_CERT_COMMON_NAME_INVALID SEO e Posizionamento 0
riminese77 [ASP.Net] Popup Bootstrap in datagrid ASP.NET 0
serena.cerutti posizioni aperte: PhP, Java, .Net Offerte e Richieste di Lavoro e/o Collaborazione 0
V [OFFRO LAVORO] Analista programmatore C# .NET Offerte e Richieste di Lavoro e/o Collaborazione 3
C [Visual Basic] Errore INSERT su DB MySQL (VB.Net) Visual Basic 4
K [ASP.Net] Realizzazione menu a tendina dipendenti ASP.NET 1
M [ASP.Net] [ASP] geoblocking e web.config ASP.NET 3
L [ASP.Net] Realizzare modulo contatti PopUp ! ASP.NET 1
K [ASP.Net] Problema stampa e modifica ms sql ASP.NET 0
W WD My Net Wi-Fi Range Extender upgrade Reti LAN e Wireless 2
D [ASP.Net] Non elencare nella select i duplicati dallo split Classic ASP 9
K [ASP.Net] Utilizzare e modificare dati linq ASP.NET 0
manuelaAGF Ricerchiamo Programmatore .NET Offerte e Richieste di Lavoro e/o Collaborazione 0
FabiettoMilano82 [OFFRO] Opportunità su Milano [RETRIBUITO] - Programmatore .NET Offerte e Richieste di Lavoro e/o Collaborazione 0
M Vendo dominio timesurfer.net Compravendita siti e domini 0
felino [ASP.Net] [VbScript] Catturare valore del Hard Faults (Page Fault) ASP.NET 0
andreacata31 [ASP.Net] Passare da Windows Application a sito Web ASP.NET 1
stellare21 [ASP.Net] Redirect a una pagina ASP.NET 2
S Asp.net MVC Hosting - SQL Server Programmazione 0
G .Net developer Offerte e Richieste di Lavoro e/o Collaborazione 0
M [ASP.Net] Cosa MI sfugge? ASP.NET 1
Etinetsrl [Retribuito] - Sviluppatore ASP.net / PHP per piattaforma CMS proprietaria Presentati al Forum 0
E [ASP.Net] Autenticazione integrata windows ASP.NET 0
momeraths [ASP.Net] Consiglio su Visual Studio ASP.NET 3
P Offro: sviluppatore software dot.net Offerte e Richieste di Lavoro e/o Collaborazione 0
G [CERCO] .NET Junior Developer e un/a Java Junior Developer. Offerte e Richieste di Lavoro e/o Collaborazione 0
G [CERCO] .NET Senior Developer Offerte e Richieste di Lavoro e/o Collaborazione 0
B Porting da Classic ASP ad ASP.NET Classic ASP 1
onweb (offro) aplicazioni web (asp.net) Offerte e Richieste di Lavoro e/o Collaborazione 0
E Creazione utenti con Net Object HTML e CSS 0
A [CERCO] scrittori per sito web www.acronimo.net Offerte e Richieste di Lavoro e/o Collaborazione 0
V Asp.net Manuali Video ASP.NET 2

Discussioni simili