Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C#] Multithreading

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    98

    [C#] Multithreading

    Ciao a tutti,

    Ho scritto una classe con un metodo che riceve in input un vettore e restituisce un double in output:

    codice:
        class Miaclasse
        {
            public double Miometodo(double[] Input)
            {
                //Codice
            }
        }
    Ho instanziato degli oggetti in una lista. Voglio eseguire Miometodo per ogni istanza. Per ora faccio così:

    codice:
            static void Main()
            {
                List<Miaclasse> Lista = new List<Miaclasse>();
                List<double> Valori = new List<double>();
                for (int i = 0; i < Lista.Count; i++)
                {
                    Valori[i] = Lista[i].Miometodo(Vettore);
                }
            }
    Mi piacerebbe eseguire ogni metodo in un thread diverso e quando tutti hanno finito, utilizzare i dati memorizzati nella lista Valori.
    Come posso fare? Premetto che non sono molto esperto di multithreading in C#..

    Grazie a tutti.
    .Fakkio.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Ti posso aiutare ma solo a metà io uso VB.NET per cui mi riesce un pò lungo tradurre il tutto. Buttangio quattro righe di codice in VB.NET si protrebbe fare cosi:

    La tua classe Miaclasse diventa:

    codice:
    Public Class Miaclasse
        Private vettore As Double
        Shared count As Integer
        Shared id As Integer
        Shared Event Done(ByVal valori As List(Of Double))
        Shared Valori As New List(Of Double)()
    
    
        Sub New(ByVal vettore As Double)
            Me.vettore = vettore
            id += 1
        End Sub
    
        Public Sub Miometodo()
            Dim count As Integer
            For n As Integer = 0 To Me.vettore
                count += 1
            Next
            Valori.Add(count)
            id -= 1
            If id = 0 Then RaiseEvent Done(Valori)
        End Sub
    
    End Class
    La tua Form diventa:

    codice:
    Public Class Form1
        Dim task() As System.Threading.Thread
        Dim WithEvents IstanzaMiaclasse As Miaclasse
        Dim ValoriRisultato As New List(Of Double)()
    
        Sub Test()
            Dim vettori As New List(Of Double)()
            vettori.Add(45)
            vettori.Add(35)
            vettori.Add(15)
            vettori.Add(25)
            vettori.Add(75)
    
    
            ReDim task(vettori.Count - 1)
            For i As Integer = 0 To vettori.Count - 1
                IstanzaMiaclasse = New Miaclasse(vettori(i))
                task(i) = New System.Threading.Thread(AddressOf IstanzaMiaclasse.Miometodo)
            Next
    
            For t As Integer = 0 To task.Count - 1
                task(t).Start()
            Next
        End Sub
    
    
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Test()
        End Sub
    
        Private Sub IstanzaMiaclasse_Done(ByVal valori As System.Collections.Generic.List(Of Double)) Handles IstanzaMiaclasse.Done
            For Each valore As Double In valori
                ValoriRisultato.Add(valore)
            Next
        End Sub
    End Class
    Non garantisco niente perchè scritto su due piedi, a me comunque funziona.
    Se ti può aiutare bene altrimenti lascio a che svilupa in c#.
    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    98
    Grazie mille!

    Ora devo provare a tradurre tutto in C# e poi vediamo se funziona.

    Intanto se qualcuno ha qualche altra idea è ben accetta!

    .Fakkio.

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.