سؤال

إنني أتطلع إلى إنشاء منشأة لاستيراد نص متعدد الخيوط (بشكل عام بتنسيق CSV إلى SQL Server 2005) وأرغب في القيام بذلك في VB.NET ولكني لست ضد C#.لدي نسخة تجريبية من VS 2008 ولا أعرف من أين أبدأ.هل يمكن لأي شخص أن يوجهني في الاتجاه الذي يمكنني من خلاله النظر إلى مصدر a واللعب به جداً تطبيق بسيط متعدد الخيوط لـ VS 2008؟

شكرًا!

هل كانت مفيدة؟

المحلول

المشار إليه ديفكس المقالة تعود إلى عام 2001 و.Net Framework 1.1، ولكن اليوم يوفر .Net Framework 2.0 ما يلي: تطبيقBackgroundWorker فصل.هذه هي فئة الترابط الموصى بها إذا كان تطبيقك يتضمن مكونًا أماميًا لواجهة المستخدم.

من خيوط MSDN وخيوط الترابط:

إذا كنت بحاجة إلى تشغيل مؤشرات ترابط الخلفية التي تتفاعل مع واجهة المستخدم ، فإن .NET Framework Version 2.0 يوفر مكونًا للخلفية يقوم بالاتصال باستخدام الأحداث ، مع تنظيم المتقاطع إلى مؤشر ترابط واجهة المستخدم.

هذا المثال من MSDN فئة عمال الخلفية يعرض مهمة في الخلفية ونسبة التقدم وخيار الإلغاء.(المثال أطول من نموذج DevX، ولكنه يحتوي على وظائف أكثر بكثير.)

Imports System.ComponentModel

Partial Public Class Page
    Inherits UserControl
    Private bw As BackgroundWorker = New BackgroundWorker

    Public Sub New()
        InitializeComponent()

        bw.WorkerReportsProgress = True
        bw.WorkerSupportsCancellation = True
        AddHandler bw.DoWork, AddressOf bw_DoWork
        AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged
        AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted

    End Sub
    Private Sub buttonStart_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        If Not bw.IsBusy = True Then
            bw.RunWorkerAsync()
        End If
    End Sub
    Private Sub buttonCancel_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        If bw.WorkerSupportsCancellation = True Then
            bw.CancelAsync()
        End If
    End Sub
    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

        For i = 1 To 10
            If bw.CancellationPending = True Then
                e.Cancel = True
                Exit For
            Else
                ' Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(500)
                bw.ReportProgress(i * 10)
            End If
        Next
    End Sub
    Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        If e.Cancelled = True Then
            Me.tbProgress.Text = "Canceled!"
        ElseIf e.Error IsNot Nothing Then
            Me.tbProgress.Text = "Error: " & e.Error.Message
        Else
            Me.tbProgress.Text = "Done!"
        End If
    End Sub
    Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        Me.tbProgress.Text = e.ProgressPercentage.ToString() & "%"
    End Sub
End Class

نصائح أخرى

هذه مقالة جيده جدا:

http://www.devx.com/DevX/10MinuteSolution/20365

بخاصة:

Dim t As Thread
t = New Thread(AddressOf Me.BackgroundProcess)
t.Start()

Private Sub BackgroundProcess()
   Dim i As Integer = 1
   Do While True
        ListBox1.Items.Add("Iterations: " + i)
        i += 1
        Thread.CurrentThread.Sleep(2000)
   Loop
End Sub

حول أفضل مستند ترابط وجدته على الإطلاق كان هذا http://www.albahari.com/threading/

إذا جاز لي، المشكلة في الأمثلة البسيطة هي أنها غالبًا ما تكون بسيطة للغاية.بمجرد تجاوز العد أو الفرز في العروض التوضيحية في الخلفية، ستحتاج عمومًا إلى تحديث واجهة المستخدم أو ما شابه، وهناك بعض الأخطاء.وبالمثل، نادرًا ما يتعين عليك التعامل مع التنافس على الموارد في أمثلة بسيطة، ويتطلب تدهور مؤشرات الترابط بأمان عندما لا يكون المورد متاحًا (مثل اتصال Db) التفكير.

من الناحية النظرية، عليك أن تقرر كيف ستقوم بتوزيع عملك عبر المواضيع وعدد المواضيع التي تريدها.هناك حمل مرتبط بإدارة سلاسل الرسائل، وتستخدم بعض الآليات تجمع سلاسل رسائل مشترك يمكن أن يخضع للتنافس على الموارد بحد ذاته (على سبيل المثال، في أي وقت تقوم فيه بتشغيل برنامج يعرض ببساطة نموذجًا فارغًا، كم عدد سلاسل الرسائل التي تراها ضمن مدير المهام).

لذا، بالنسبة لحالتك، تحتاج سلاسل الرسائل التي تقوم بالتحميل الفعلي إلى الإشارة مرة أخرى إذا اكتملت، وإذا فشلت (وما هو الفشل).يجب أن تكون وحدة التحكم قادرة على التعامل مع هؤلاء وإدارة عمليات البدء/الإيقاف وما إلى ذلك.

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

وعلى الرغم من كل هذا، فأنا لست نبي الهلاك.المراجع هنا أكثر من كافية لمساعدتك في تحقيق ما تريد ولكن انتبه إلى أن أحد الأسباب التي تجعل الترابط يبدو معقدًا هو أنه يمكن أن يكون :)

إذا كنت تريد مزيدًا من التحكم مقارنة بـBackgroundWorker/Threadpool ولكنك لا تريد أن تفعل كل شيء بنفسك، فهناك على الأقل مكتبتان جيدتان جدًا لخيوط الهدية الترويجية تتجولان في المكان (Wintellect وPowerThreading)

هتافات

سيمون

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top