مشاركة عبر


معلمات وقيم إرجاع الإجراءات متعددة مؤشرات الترابط (C# و Visual Basic)

تزويد و إرجاع قيم في أحد تطبيقات ذات مؤشرات الترابط المتعددة تعتبر معقدة لأنه يجب أن يتم تمرير المُنشئ لفئة مؤشر الترابط مرجع إجراءًا بدون وسائط ويرجع أية قيمة. المقاطع التالية تظهر بعض الطرق البسيطة لتوفير معلمات و قيم العودة من الإجراءات على مؤشرات الترابط المتفرقة.

تزويد معلمات للحصول على إجراءات متعددة مؤشرات الترابط

أفضل طريقة لتزويد المعلمات لأسلوب متعددة مؤشرات الترابط هي التفاف الأسلوب الهدف في فئة وتعريف حقول للفئة التي ستقوم بدور معلمات مؤشر ترابط جديد. فوائد هذا الأسلوب هو أنه يمكنك إنشاء مثيل جديد من الفئة, مع معلمات الخاص به في كل مرة تريد إلى يبدأ مؤشر ترابط جديد. على سبيل المثال، افترض أن لديك دالة بحساب ناحية مثلث كما في تعليمات برمجية التالية:

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

يمكنك كتابة فئة تقوم بلف دالة CalcAreaو تنشئ حقول لتخزين معلمات الإدخال كما يلي:

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

لإستخدام AreaClass, يمكنك إنشاء الكائن AreaClass وتعيين الخصائص Baseو Height كما هو موضح في التعليمات البرمجية التالية:

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

ولاحظ أن الإجراء TestArea لا يفحص قيمة الحقل Areaبعد استدعاء الأسلوب CalcArea. لأن CalcAreaيتم تشغيله على مؤشر ترابط منفصل Areaولا يُضمن الحقل إلى يمكن تعيين إذا تحقق مباشرة بعد استدعاء Thread.Start. تتناول هذه المقالة التالية طريقة أفضل لإرجاع القيم من إجراءات متعددة مؤشرات الترابط.

إرجاع القيم من إجراءات متعددة مؤشرات الترابط

إرجاع القيم من الإجراءات التي يتم تشغيلها على مؤشرات ترابط منفصلة يتم تعقيدها لأن الإجراءات لا يمكن أن تكون دالات و لا يمكن إستخدام الوسيطاتByRef. إن أسهل طريقة لإرجاع القيم إستخدام المكون BackgroundWorker لإدارة مؤشرات الترابط و تنفيذ حدث عند انتهاء المهمة ومعالجتها النتائج بإستخدام معالج الحدث.

يقوم المثال التالي بإرجاع القيمة عن طريق رفع حدث من إجراء قيد التشغيل على مؤشر ترابط منفصل:

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

توفر المعلمات ثم إرجاع القيم إلى تجمع عمليات جزئية لعمليات جزئية بإستخدام اختياري متغير الكائن ByVal من الأسلوب QueueUserWorkItem. تعتمد مؤشر ترابط جهاز ضبط الوقت عمليات جزئية كائن الولاية لهذا الغرض. للحصول على معلومات حول تجمع مؤشر الترابط و أجهزة ضبط الوقت مؤشر ترابط راجع تجمع مؤشر ترابط (C# و Visual Basic)و مؤشر ترابط تجمع (C# و Visual Basic).

راجع أيضًا:

المرجع

مؤشر ترابط تجمع (C# و Visual Basic)

أحداث (C# البرمجة الدليل)

المفوضين (C# البرمجة الدليل)

المبادئ

تجمع مؤشر ترابط (C# و Visual Basic)

تطبيقات ذات مؤشرات ترابط (C# و Visual Basic)

موارد أخرى

أحداث (Visual Basic)

المفوضين (Visual Basic)

multithreading في المكونات