سؤال

قد يبدو هذا مثل ما المفتعلة سبيل المثال, لكن أنا تركت الخدش رأسي.

حسنا, لدي وحدة التحكم التطبيق الذي instantiates على WindowsForm ويدعو طريقة تسمى DoSomeWork() في النموذج.

class Program
  { 
    static void Main(string[] args)
    {
      Form1 form = new Form1();         
      form.DoSomeWork();   
    }
  }

Form1 يبدو مثل هذا...

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    public void DoSomeWork()
    {
      OuterClass outerClass = new OuterClass();
      outerClass.DoSomeWork();
    }    
  }

الخارجي الدرجة ، في المقابل ، يبدو مثل هذا...

public class OuterClass
  {
    public void DoSomeWork()
    {
      InnerClass innerClass = new InnerClass();
      innerClass.DoSomeWork();
    }
  }

وأخيرا InnerClass يبدو مثل هذا...

public class InnerClass
  {
    private BackgroundWorker _backgroundWorker = new BackgroundWorker();

    public InnerClass()
    {
      _backgroundWorker.WorkerReportsProgress = true;
      _backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
      _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged);
    }

    void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      int i = 0; //I've placed a break point here. But it's never hit
    }

    void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
      BackgroundWorker worker = sender as BackgroundWorker;

      worker.ReportProgress(42);
    }

    public void DoSomeWork()
    {
      _backgroundWorker.RunWorkerAsync();
    }
  }

لسبب غير معروف (بالنسبة لي) ، BacgroundWorker في InnerClass لا يبدو أن النار ProgressChanged هذا الحدث.لو كنت محل

Form1 form = new Form1();

مع

OuterClass outerClass = new OuterClass()

في برنامج الدرجة, أنه يعمل بشكل جيد.ذلك هو السبب في أن أحداث بلدي لا النار عندما أتصل نفس الأساليب من خلال نموذج ؟

وذلك بفضل!

تحرير:يبدو لي أن يكون رمي الناس من خلال ترك ProgressChanged معالج الحدث كما رمي NotImplementedException ، حتى لقد إزالته من أجل الوضوح.

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

المحلول

نسيت أن تبدأ رسالة حلقة, تطبيق الاستدعاء.تشغيل() هو مطلوب.دون حلقة الرسالة ، BackgroundWorker الأحداث لا يمكن أن تنجح.إصلاح:

static void Main(string[] args)
{
  Application.Run(new Form1());   
}

دعوة DoSomeWork() في شكل منشئ أو الحدث Load.

نصائح أخرى

هل فعلا throw NotImplementedException(); في معالج ؟ أو كنت مجرد الاستهزاء هذا سريع و نسيت أن إزالة ذلك ؟

تخميني أنه يرتبط موضوع مختلف شقة النماذج المستخدمة.

من تجربتي لو واحد خيط شقة غير واجهة المستخدم موضوع يطرح استثناء خارج من أهم UI هذا الموضوع ببساطة سوف يموت دون أي تحذير.

نماذج Windows تتطلب شقة مختلفة نموذج من تطبيقات وحدة التحكم إذا كنت أتذكر بشكل صحيح.يمكن أن يكون مصدر المشكلة.

أنا يمكن أن تكون خاطئة ولكن يجب أن تعطي بعض المؤشرات.

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