تشغيل فئة موضوع جديد
-
03-07-2019 - |
سؤال
أريد أن أبدأ العمل في موضوع جديد أو استخدام backgroundworker أن تفعل ذلك ولكن لم أفعل ذلك من قبل و أطلب منك اللي تبونه الطريقة يجب أن تفعل ذلك.
البرنامج لديه datagridview مع قائمة من الملفات ملف واحد لكل صف.أريد من المستخدم أن يكون قادرا على تحديد صف واحد ثم اضغط على "ابدأ التحميل" لبدء خلفية مهمة تحميل.أريد الحصول على الأحداث الخلفي من تقدم التنزيل.
لدي الدرجة clsDownload الذي يعالج كل شيء يثير الأحداث مرة أخرى ولكن كيف يمكنني تنفيذ backgroundworking?
يجب علي استخدام النظام.ComponentModel.BackgroundWorker داخل الطبقة أو إنشاء بعض المجمع الذي يعالج هذا أو استخدام بعض خيوط الأشياء ؟
شكرا
تحرير: أنا لا أفهم كيف لتنفيذ تحميل بلدي في backgroundworker ، أي مثال صغير من شأنه أن يكون لطيفا جدا.مثال على msdn لم يحصل لي الآن.
يجب تحميل الدرجة التي StartDownload-وظيفة.يجب استخدام backgroundworker في الصف أو في المتصل ؟ "شعور غبي"
المحلول
لقد خلق عدة فئات مختلفة تتضمن BackgroundWorker.ما أفعله عادة هو أن يكون BackgroundWorker مكون على الشكل الذي سوف تكون مفتوحة عندما الوظيفة التي يؤديها ، ثم تمرير تلك الحالة إلى منشئ عملي الدرجة.
هنا هو ما عملك فئة قد تبدو مثل:
Private m_bwMain As BackgroundWorker
Public Sub New(ByVal bwMain As BackgroundWorker)
m_bwMain = bwMain
'additional setup code here
End Sub
لبدء العمل ، كنت تفعل شيئا مثل هذا في معالج الحدث Click الخاص بك ابدأ زر التحميل:
lblStatus.Text = "Initializing ..."
bgwMain.RunWorkerAsync(someFileName)
أعلن عملي فئة خاصة الأعضاء من النموذج الحالي ، ثم مثيل في BackgroundWorker.الحدث DoWork.من هناك يمكنك استدعاء الأسلوب الخاص بك لتحميل الملف:
Private Sub bgwMain_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwMain.DoWork
m_oJobEngine = New JobEngine(CType(sender, BackgroundWorker))
m_oJobEngine.DownloadFile(CStr(e.Argument))
End Sub
وتقديم تقرير عن التقدم المحرز إلى المستخدم ، يمكنك التعامل مع الأحداث التي أثارها الفئة الخاصة بك في النموذج الرئيسي.تحتاج فقط للتأكد من عمل كائن فئة الإعلان على WithEvents الكلمة.من تلك معالجات يمكنك الاتصال ReportProgress طريقة BackgroundWorker.من داخل ReportProgress يمكنك إجراء أية تغييرات تحتاج إلى واجهة المستخدم للإشارة إلى التقدم.هنا مثال:
Private Sub m_oJobEngine.DownloadProgress(ByVal bgw as Backgroundworker, ByVal bytesTransferred as Long) Handles m_oJobEngine.DownloadProgress
bgw.ReportProgress(0, bytesTransferred)
End Sub
Private Sub bgwMain_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwMain.ProgressChanged
lblStatus.Text = CLng(e.UserState).ToString & " bytes transferred."
End Sub
ويساعد هذا الأمل.
نصائح أخرى
أنا كنت فقط سوف لا تحميل و لا حاجة أخرى المتزامن تجهيز, يمكنك فقط استخدام المتزامن أساليب WebClient
فئة.على الرغم لأن لديك بالفعل الخاصة بك فئة, هذا ربما لا يكون الحل بالنسبة لك.
وإلا, يمكنك استخدام BackgroundWorker
كما ذكرت.MSDN الصفحة مثال على كيفية القيام بذلك.
تحرير: القصة القصيرة هي:
- إنشاء
BackgroundWorker
من المتصل ؛ - عندما تريد بدء العمل في الخلفية ، يمكنك استدعاء
BackgroundWorker.RunWorkerAsync
; - في
DoWork
معالج الحدث لديك خلفية العمل ، في حالة بدء تشغيل الخاص بك تحميل الطبقة ؛ - في حين كنت تفعل خلفية العمل ، عليك أن تحقق كل مرة واحدة في حين
CancelationPending
; - عندما تريد أن التقرير بعض التقدم ، تحتاج إلى حساب في نسبة المكالمات
ReportProgress
.
وإذا كنت بحاجة إلى شيء حقا حسب الطلب, يمكنك دائما إنشاء الخاصة بك Thread
.
أنا شخصيا سوف العصا مع BackgroundWorker
.كان لديه مجموعة لطيفة من الإخطارات لمختلف مراحل العمل.إذا كنت تستخدم Thread
, سيكون لديك لتنفيذ هذه نفسك.
وأود أيضا تأكد من رمز لا تخلق الكثير من الحالات.كنت تريد أن تحد من عدد من concurent تنزيل انتظار أي شيء في الماضي هذا العدد.
أود أن ننصح بشدة BackgroundWorker
إذا كنت بحاجة إلى توفير التغذية المرتدة المستخدم على واجهة المستخدم.على ProgressChanged
و RunWorkerCompleted
الأحداث يتم تشغيل مؤشر ترابط واجهة المستخدم, لذلك ليس هناك حاجة للقيام التنظيم ، والتي يمكن أن تجعل النظام الخاص بك رمز أكثر تعقيدا.
على backgroundworker يبدو أنه يجب العمل...هناك مثال على MSDN.
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
أو هل يمكن أن تفعل شيئا مثل:
WaitCallBack workCallBack= new WaitCallBack(DownloadMethod);
if(!ThreadPool.QueueUserWorkItem(workCallBack, "ThreadPooled")
{
// Unable to Pool
}
// Work has been added to pool and will execute when possible
يعتمد المعلمات ما إذا كان أي كنت بحاجة لهذا الموضوع.
الفئة التي تستخدم clsDownload (ربما فئة النموذج) يجب استخدام BackgroundWorker لتشغيل طريقة التحميل.