Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C#/VB.NET] ThreadPool

  1. #1

    [.NET] ThreadPool

    se io dovessi prendere N elementi per ogni elemento richiedere N dati e attendere N secondi per poi insierirli dentro ad un db la cosa che mi viene da pensare che per non prendere il 100% della CPU debba utizzare i thread.

    vedendo il link
    ThreadPool

    mi viene da pensare a questo:

    codice:
    for(int i=0; i<N;i++)
    {
       PrendiDati(v[i]);
    }
    
    void PrendiDati(string dato)
    {
       ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
    }
    
    static void ThreadProc(Object stateInfo) 
    {
      qui richiedo i dati e poi li inserisco nel db        
    }

    c'è qualcosa di sbagliato vero? Perchè in questo modo è come se non facesse mai la ThreadProc.



    mi potreste gentilmente dire come strutturare il problema? anche in vb.net tanto è indifferente.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    798
    nel link che hai postato c'è anche una Sleep
    Thread.Sleep(1000);

    tu l'hai rimossa xchè? Letto il commento?
    // If you comment out the Sleep, the main thread exits before
    // the thread pool task runs.

    se la rimuovi il thread principale esce prima che il task del pool di thread venga avviato.
    Ans.

  3. #3
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Originariamente inviato da ans
    nel link che hai postato c'è anche una Sleep
    Thread.Sleep(1000);

    tu l'hai rimossa xchè? Letto il commento?
    // If you comment out the Sleep, the main thread exits before
    // the thread pool task runs.

    se la rimuovi il thread principale esce prima che il task del pool di thread venga avviato.
    Thread.Sleep(1000) serve solo per far vedere il risultato prima che l'applicazione esca!

    Da quello che ho visto, dovrebbe funzionare in quella maniera.
    Io ho provato con questo esempio:
    codice:
    Imports System.Threading
    Module Module1
    
        Sub Main()
            For i As Integer = 1 To 20
                'Crea un nuovo oggetto per il prossimo compito
                Dim task As New LightweightTask
                task.SomeData = "other data"
                'Esegue l'operazione con il thread del pool
                '(Passa il contatore come argomento)
                ThreadPool.QueueUserWorkItem(AddressOf task.DoTheTask, i)
            Next
        End Sub
    
        Class LightweightTask
            Public SomeData As String
    
            Sub DoTheTask(ByVal state As Object)
                Console.WriteLine("Message from thead #{0}", state)
            End Sub
        End Class
    End Module
    e sembra che fuziona...
    Jupy

  4. #4
    anche a me funziona ma, ho notato che se nella funzione che richiamiamo c'è un componente un service che restituisce dei dati e per restituirteli impiega anche qualche minuto, il tutto si sfalsa.

    io ho provato con un loop di 2000. Per ogni elemento ho dovuto chiedere al service uno storico. Il service impiega qualche minuto prima di rispondermi. una volta risposto inserisco tutto in un db.


    Il sisultato è che prima che l'applicazione termini aspetto un 10 minuti (che mi va bene) però non vedo nessun risultato inserito nel DB.


    boh


    PS. con i thread normali aspetto un 15 minuti e mi trovo tutto inseirito però rischio sempre Out of memory

  5. #5
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    non so cosa dirti..è strano! Non vorrei che le varie istruzioni di scrittura nel db debbano essere racchiuse in un blocco tramite l'ggetto ReaderWriterLock
    Prova a dare vedere quest'oggetto.
    Jupy

  6. #6
    codice:
    public static void Storico(object titolo)
    {
       ThreadPool.QueueUserWorkItem(new WaitCallback(Allhistory), titolo);
    }
    codice:
    private static void Allhistory(object stateinfo)
    {
       richiamo componente ed inserisco nel db
    }
    è come se il thread finesse prima di fare tutta la funzione Allhistory

    sono sicuro perchè nel db non trovo neanche mezzo record.


    come posso fare?

  7. #7
    AutoResetEvent autoEvent = new AutoResetEvent(false);
    ThreadPool.QueueUserWorkItem(new WaitCallback(Allhistory), autoEvent);
    autoEvent.WaitOne();


    poi nella funzione


    ((AutoResetEvent)stateinfo).Set();

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.