استيراد VB.Net (أو C#) 2008 متعدد الخيوط
-
01-07-2019 - |
سؤال
إنني أتطلع إلى إنشاء منشأة لاستيراد نص متعدد الخيوط (بشكل عام بتنسيق CSV إلى SQL Server 2005) وأرغب في القيام بذلك في VB.NET ولكني لست ضد C#.لدي نسخة تجريبية من VS 2008 ولا أعرف من أين أبدأ.هل يمكن لأي شخص أن يوجهني في الاتجاه الذي يمكنني من خلاله النظر إلى مصدر a واللعب به جداً تطبيق بسيط متعدد الخيوط لـ VS 2008؟
شكرًا!
المحلول
المشار إليه ديفكس المقالة تعود إلى عام 2001 و.Net Framework 1.1، ولكن اليوم يوفر .Net Framework 2.0 ما يلي: تطبيقBackgroundWorker فصل.هذه هي فئة الترابط الموصى بها إذا كان تطبيقك يتضمن مكونًا أماميًا لواجهة المستخدم.
إذا كنت بحاجة إلى تشغيل مؤشرات ترابط الخلفية التي تتفاعل مع واجهة المستخدم ، فإن .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)
هتافات
سيمون