Sdílet prostřednictvím


Parametry a návratové hodnoty pro procedury ve více vláknech (C# and Visual Basic)

Dodání a vrácení hodnoty ve víceprocesových aplikací je složitý, protože konstruktoru třídy podproces musí být předán odkaz na postup, žádné argumenty a vrátí hodnotu žádná.Následující sekce obsahují některé jednoduché způsoby dodávky parametry a vracet hodnoty postupy oddělené podprocesy.

Zadání parametrů s více podprocesy postupy

Nejlepší způsob, jak zadat parametry pro volání metody s více podprocesy je obtékání cílové metodu ve třídě a definovat pole pro danou třídu, která bude sloužit jako parametry pro nový podproces.Výhodou tohoto přístupu je, že můžete vytvořit novou instanci třídy, s vlastní parametry, pokaždé, když chcete začít nový podproces.Předpokládejme například, že máte funkci, která vypočítává plochu trojúhelníku, jako v následujícím kódu:

Function CalcArea(ByVal Base As Double, ByVal Height As Double) As Double
    CalcArea = 0.5 * Base * Height
End Function
double CalcArea(double Base, double Height)
{
    return 0.5 * Base * Height;
}

Třídy, který se zalamuje můžete psát CalcArea funkci a vytvoří pole k uložení vstupní parametry takto:

Class AreaClass
    Public Base As Double 
    Public Height As Double 
    Public Area As Double 
    Sub CalcArea()
        Area = 0.5 * Base * Height
        MessageBox.Show("The area is: " & Area.ToString)
    End Sub 
End Class
class AreaClass
{
    public double Base;
    public double Height;
    public double Area;
    public void CalcArea()
    {
        Area = 0.5 * Base * Height;
        MessageBox.Show("The area is: " + Area.ToString());
    }
}

Použití AreaClass, můžete vytvořit AreaClass objektu a nastavit Base a Height vlastnosti, jak je znázorněno v následujícím kódu:

Protected Sub TestArea()
    Dim AreaObject As New AreaClass
    Dim Thread As New System.Threading.Thread(
                        AddressOf AreaObject.CalcArea)
    AreaObject.Base = 30
    AreaObject.Height = 40
    Thread.Start()
End Sub
protected void TestArea()
{
    AreaClass AreaObject = new AreaClass();

    System.Threading.Thread Thread =
        new System.Threading.Thread(AreaObject.CalcArea);
    AreaObject.Base = 30;
    AreaObject.Height = 40;
    Thread.Start();
}

Všimněte si, že TestArea postup nekontroluje hodnoty Area pole po volání CalcArea metoda.Protože CalcArea na samostatný podproces spuštěn Area pole není zaručena nastavit, pokud zaškrtnete ihned po volání Thread.Start.Další část se zabývá lepší způsob vracet hodnoty postupy s více podprocesy.

Vracení hodnot z postupů s více podprocesy

Vracení hodnot z procedury, které spustit oddělené podprocesy ztěžuje skutečnost, že postupy nemohou být funkce, nelze použít ByRef argumenty.Nejjednodušším způsobem vracet hodnoty je použít BackgroundWorker součást spravovat vaše podprocesů a zvýšit události po dokončení úkolu a zpracovat výsledky s obslužnou rutinu události.

Následující příklad vrátí hodnotu zvýšením událost z postupu na samostatný podproces spuštěn:

Private Class AreaClass2
    Public Base As Double 
    Public Height As Double 
    Function CalcArea() As Double 
        ' Calculate the area of a triangle. 
        Return 0.5 * Base * Height
    End Function 
End Class 

Private WithEvents BackgroundWorker1 As New System.ComponentModel.BackgroundWorker

Private Sub TestArea2()
    Dim AreaObject2 As New AreaClass2
    AreaObject2.Base = 30
    AreaObject2.Height = 40

    ' Start the asynchronous operation.
    BackgroundWorker1.RunWorkerAsync(AreaObject2)
End Sub 

' This method runs on the background thread when it starts. 
Private Sub BackgroundWorker1_DoWork(
    ByVal sender As Object, 
    ByVal e As System.ComponentModel.DoWorkEventArgs
    ) Handles BackgroundWorker1.DoWork

    Dim AreaObject2 As AreaClass2 = CType(e.Argument, AreaClass2)
    ' Return the value through the Result property.
    e.Result = AreaObject2.CalcArea()
End Sub 

' This method runs on the main thread when the background thread finishes. 
Private Sub BackgroundWorker1_RunWorkerCompleted(
    ByVal sender As Object,
    ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs
    ) Handles BackgroundWorker1.RunWorkerCompleted

    ' Access the result through the Result property. 
    Dim Area As Double = CDbl(e.Result)
    MessageBox.Show("The area is: " & Area.ToString)
End Sub
class AreaClass2
{
    public double Base;
    public double Height;
    public double CalcArea()
    {
        // Calculate the area of a triangle. 
        return 0.5 * Base * Height;
    }
}

private System.ComponentModel.BackgroundWorker BackgroundWorker1
    = new System.ComponentModel.BackgroundWorker();

private void TestArea2()
{
    InitializeBackgroundWorker();

    AreaClass2 AreaObject2 = new AreaClass2();
    AreaObject2.Base = 30;
    AreaObject2.Height = 40;

    // Start the asynchronous operation.
    BackgroundWorker1.RunWorkerAsync(AreaObject2);
}

private void InitializeBackgroundWorker()
{
    // Attach event handlers to the BackgroundWorker object.
    BackgroundWorker1.DoWork +=
        new System.ComponentModel.DoWorkEventHandler(BackgroundWorker1_DoWork);
    BackgroundWorker1.RunWorkerCompleted +=
        new System.ComponentModel.RunWorkerCompletedEventHandler(BackgroundWorker1_RunWorkerCompleted);
}

private void BackgroundWorker1_DoWork(
    object sender,
    System.ComponentModel.DoWorkEventArgs e)
{
    AreaClass2 AreaObject2 = (AreaClass2)e.Argument;
    // Return the value through the Result property.
    e.Result = AreaObject2.CalcArea();
}

private void BackgroundWorker1_RunWorkerCompleted(
    object sender,
    System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    // Access the result through the Result property. 
    double Area = (double)e.Result;
    MessageBox.Show("The area is: " + Area.ToString());
}

Můžete zadat parametry a vracet hodnoty pro podproces fondu podprocesů pomocí nepovinné ByVal proměnné stavu objektu QueueUserWorkItem metoda.Stav objektu podprocesu časovače podprocesů podporují také pro tento účel.Informace o podprocesu sdružování a podprocesu časovače, Sdružování vláken (C# and Visual Basic) a Časovače vláken (C# and Visual Basic).

Viz také

Úkoly

Návod: Multithreading s komponentou BackgroundWorker (C# a Visual Basic)

Referenční dokumentace

Synchronizace vláken (C# and Visual Basic)

Události (Průvodce programováním v C#)

Delegáti (Průvodce programováním v C#)

Koncepty

Sdružování vláken (C# and Visual Basic)

Vícevláknové aplikace (C# and Visual Basic)

Další zdroje

Události (Visual Basic)

Delegáti (Visual Basic)

Použití více vláken v komponentách