سؤال

أريد أن أبدأ العمل في موضوع جديد أو استخدام 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 لتشغيل طريقة التحميل.

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