Aracılığıyla paylaş


Parametreleri ve dönüş değerleri çok iş parçacıklı yordamlar (C# ve Visual Basic)

İş parçacığı sınıfının yapıcı hiçbir baðýmsýz deðiþken almaz ve herhangi bir değer döndüren bir yordam başvurusudur geçirilmelidir çünkü sağlayarak ve çok iş parçacıklı bir uygulamada değerleri döndürme karmaşıktır.Aşağıdaki bölümlerde parametreleri sağlayın ve değerleri yordamlardan üzerinde ayrı bir iş parçacığı dönmek için basit bazı yollarını gösterir.

Çok iş parçacıklı yordamlar için parametre sağlama

Çok iş parçacıklı bir yöntem çağrısı için parametreleri sağlamak için en iyi yolu, bir sınıfta hedef yöntemi Kaydır ve yeni iş parçacığı parametre olarak hizmet verecek o sınıf için alanları tanımlamak sağlamaktır.Bu yaklaşımın avantajı, yeni bir iş parçacığı başlamasını istediğiniz her zaman, sınıfın yeni bir örneğini kendi parametreleriyle oluşturabilmenizdir.Örneğin, aşağıdaki kodda olduğu gibi üçgenin alanı hesaplayan bir işlevi olduğunu varsayalım:

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;
}

Saran bir sınıfı yazabilirsiniz CalcArea işlev ve giriş parametrelerini aşağıdaki gibi depolama alanları oluşturur:

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());
    }
}

Kullanmak için AreaClass, oluşturabileceğiniz bir AreaClass object ve set Base ve Height aşağıdaki kodda gösterildiği gibi özellikleri:

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();
}

Dikkat TestArea yordam değerini denetimi yapma Area alan arama sonra CalcArea yöntemi.Çünkü CalcArea ayrı bir iş parçacığı üzerinde çalışan Area alan hemen sonra arama onay ayarlamak için garanti değil Thread.Start.Sonraki bölümde, çok iş parçacıklı yordamlardan değerler döndürmek için daha iyi bir yol anlatılmaktadır.

Çok iş parçacıklı yordamlardan değerleri döndürme

Ayrı bir iş parçacığı üzerinde çalışan yordamlar gelen değerleri döndürme karmaşık yordamları, işlevleri olamaz ve kullanamazsınız gerçeğiyle ByRef bağımsız değişkeni.Değerler döndürmek için en kolay yolu BackgroundWorker kendi iş parçacığı yönetmek ve görev tamamlandığında bir olayı başlatmak ve olay işleyicisi sonuçları işlemek için Bileşen.

Aşağıdaki örnek, olaya ayrı bir iş parçacığı üzerinde çalışan bir yordamdan yükselterek bir değer döndürür:

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());
}

Parametreleri sağlar ve iş parçacığı havuzu iş parçacığı için döndürülen değerler kullanılarak isteğe bağlı ByVal durum nesnesi değişkeni QueueUserWorkItem yöntemi.Süreölçer iş parçacığının iş parçacığı, bu amaçla bir durum nesnesi de destekler.İş parçacığı havuzu ve iş parçacığı zamanlayıcıları hakkında daha fazla bilgi için bkz: İş parçacığı havuzu (C# ve Visual Basic) ve İş parçacığı zamanlayıcılar (C# ve Visual Basic).

Ayrıca bkz.

Görevler

İzlenecek yol: Çoklu kullanım BackgroundWorker bileşeniyle (C# ve Visual Basic)

Başvuru

İş parçacığı eşitleme (C# ve Visual Basic)

Olayları (C# Programlama Kılavuzu)

Temsilciler (C# Programlama Kılavuzu)

Kavramlar

İş parçacığı havuzu (C# ve Visual Basic)

Çok iş parçacıklı uygulamalar (C# ve Visual Basic)

Diğer Kaynaklar

Olayları (Visual Basic)

Temsilciler (Visual Basic)

Çoklu kullanım bileşenleri