Parametry a vrácené hodnoty procedury s více podprocesy (C# a 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, Podproces sdružování (C# a Visual Basic) a Podprocesu časovače (C# a Visual Basic).
Viz také
Úkoly
Názorný postup: Multithreading s komponentou BackgroundWorker (C# a Visual Basic)
Referenční dokumentace
Podproces synchronizace (C# a Visual Basic)
Události (Příručka programování C#)
Delegáti (Příručka programování C#)
Koncepty
Podproces sdružování (C# a Visual Basic)
Aplikace s více podprocesy (C# a Visual Basic)