Ciclo for

mercoledì 31 marzo 2010 - 19.36

ilario Profilo | Senior Member

cioa

ho una griglia contenente dei file da upload in un sito


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

faccio un ciclo sulle righe della griglia, caricando il file in una cartella web se il file è caricato correttamente mi ritorna true

nel ciclo controllo se è true e aggiorno una label

il problema che parte il ciclo, ma fino a quando non è portato a termine, tutto il software è bloccato e non aggiorna niente come posso fare

grazie
ilario

kataklisma Profilo | Senior Member

Ciao!

Il tuo problema è molto comune!La tua applicazione in pratica esegue un thread e tu esegui tutte le tue operazioni (come per esempio quella da te indicata) in quest'unico thread, bloccando completamente l'interfaccia grafica ed ogni qualsiasi altra operazione.

Devi implementare una programmazione multithreading, che ti permette quindi di "avviare" "operazioni" diverse in thread diversi, lasciando cosi libero il thread principale!

Implementa questa direttiva using (o imports se usi VB.net) :

using System.Threading;

Questa libreria del framework ti permette di programmare in multithreading.

La questione è molto complessa e richiederebbe un bel po di studio ma ti do comunque delle direttive generali per poter approcciarti al meglio al discorso.

Vogliamo ad esempio cercare di far partire uno splashscreen che in background effettui delle operazioni senza pero bloccare l'animazione di loading:

Crei un oggetto thread di nome loading:

private thread loading;

poi crei una routine che effettui le operazioni di background :

private void Operazioni() { //Lista operazioni }

ora, non devi far altro che inizializzare il thread loading passandogli il metodo da elaborare nel thread secondario e farlo partire :

this.loading = new Thread(new ThreadStart(Operazioni)); this.loading.Start();

Cosi il secondo thread eseguirà le operazioni senza pero bloccare la GUI e/o le operazioni svolte nel thread principale!

Ti consiglio di dare un'occhiata alla parametrizedThreadStart e sopratutto al backgroundWorker che ti permette di gestire i threading in manierà piu semplice e sicura.

Dai un'occhiata anche all'istruzione lock (che blocca l'accesso a risorse in caso di concorrenza da parte di piu thread).

Purtroppo è un'argomento un po complesso, ma spero riuscirai a risolvere!

Ciao!!!


ilario Profilo | Senior Member

ti ringrazio
nel frattempo avevo appunto provato con backgrounworked, ma quando aggiornavo la label mi dava errore di cross

ora l'ho sistemato

grazie mille
ilario

ps comunque non capisco una cosa

la barra e l'applicazione posso capire che si blocchino mentre fa il ciclo, ma dovrebbe comunque eseguire le istruzioni all'interno del ciclo


kataklisma Profilo | Senior Member

Ciao!

Scusami ma non riesco a capire cosa intendi con questa frase :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Le istruzioni nel for non eseguono il caricamento nella cartella web?

ilario Profilo | Senior Member

nel ciclo inserisce l'immagine e se torna true allora
< nrFileUploaded += 1

lo fa
< Me.lblFileUploaded.Text = "Sono stati Scaricati sul sito Nr " & nrFileUploaded & " File"
< GridViewImmagini.SelectRow(nrFileUploaded - 1)

non lo fa, non dovrebbe in teoria eseguirmi queste due righe (aggiornare la label e la griglia) e poi continuare nel ciclo inserendo l'immagine successiva?


kataklisma Profilo | Senior Member

Ma ti ritorna errore in fase di debug?

ilario Profilo | Senior Member

no nessun errore non lo fa e basta, non aggiorna ne la label ne la griglia, le aggiorna solo sull'ultima immagine, molto probabilmente lo fa ma non lo visualizza,
comunque mettendolo in un threand a parte come mi hai suggerito funziona, era solo una curiosità

kataklisma Profilo | Senior Member

Ah! Ora ho capito!

Questo comportamento è normale quando si fanno questo tipo di operazioni, usando il multithreading invece puoi ovviare a queste situazioni ;)

Spero ti sia stato d'aiuto!

ilario Profilo | Senior Member

si grazie mille

alla prossima

ciao
ilario
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5