باستخدام OpenNETCF.NET.PTP داخل الفصل بدلا من داخل نموذج Windows

StackOverflow https://stackoverflow.com/questions/899328

  •  23-08-2019
  •  | 
  •  

سؤال

حتى الآن أنا أستخدم كائن FTP داخل نموذج Windows. يعمل كائن FTP في مؤشر ترابط منفصل، لذلك للتأكد من عدم تجميد تطبيقي، يمكنني استخدام القطعة التالية من التعليمات البرمجية:

private void OnResponse(string response)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new StringDelegate(OnResponse), new object[] { response });
            return;
        }
    } //end of OnResponse

أنا لست واضحا تماما حول ما هو مندوب السلسلة، ولكن هذا يعمل.

ومع ذلك، أنا الآن إعادة صياغة وأرغب في إخفاء FTP في فصل. سؤالي هو كيف يمكنني التأكد من عدم تجميد الخيط الرئيسي؟ جميع المراجع عبر الإنترنت فيما يتعلق بزيادة الأحداث داخل الفصول الدراسية منطقية، لكنني لم أجد مثالا واحدا حيث يكون التطبيق متعدد المراحل. قلقي الأكبر سيكون للمتابعين.

في التعليمات البرمجية أعلاه هذا هو شكل. إذا قمت بإخفاء كائن FTP داخل فئة مثل ما يلي:

abstract class MyClass
{
    //data members
    private FTP _ftp;

    //other data members, methods, and properties etc
}

"هذا" يصبح كائنا من myclass. لست متأكدا مما إذا تم تنفيذ خاصية Invokerquired في الفصل (ربما يجب علي أن أجعلها تنفذ واجهة خاصة تحتوي على هذه الممتلكات؟). أو ربما أفتقد شيئا ولا من المفترض أن أستخدم كائنات متعددة المراحل داخل الفصول؟

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

المحلول

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

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

هناك الكثير من الأمثلة على الويب لاستخدام Control.invoke، لذلك يجب أن تكون قادرا على تنفيذها بسهولة إلى حد ما.

نصائح أخرى

الطريقة الأكثر ترجيحا لتصميم هذا هو السماح للمتصل من "myclass" بإحتسار أو عدم استدعاء حسب الحاجة. أود أن أقوم بتصميم فصلك لإطلاق حدث عندما يحدث الاستجابة.

تذكر أنه رمز فقط يتفاعل مع نظام التشغيل Windows UI الذي يحتاج إلى استدعاء D-D على الخيط الرئيسي. يمكن القيام بأي مناولة أخرى في OnResponse في خيط الخلفية لا مشكلة.

إذا لم يكن "myclass" كائن Windows مثل نموذج أو عنصر تحكم، فلن يكون لديك المتسترفين تماما كما قلت. لكنها لا تحتاج إلى intercerquiredquired. إذا كان هناك بعض الطبقة الأخرى التي تمثل كائن UI أمرا بحاجة إلى القيام بشيء استجابة لكائن FTP، فقد يؤدي كائن UI إلى إجراء اختبار Innessurequired.

آمل أن يكون هذا واضح!


تحرير: معلومات Addl

بالتأكيد ستكون المعالج OnReceiSt في فئة FTP الخاصة بك. لذلك أنا أفكر في شيء مثل هذا:

الطبقة العامة myftpclass {الحدث العام EventHandler DataReceived؛ // نموذج UI يمكن الاشتراك في هذا الحدث

 private void OnReceived()
 {
   //so the FTP has returned data
   // Do stuff here that can be on the background thread like saving
   // the file in an appropriate place, or whatever.


   // now trigger the DataReceived event.  Anyone who cares about data being received
   // can subscribe to this and do whatever is appropriate.
   if (DataReceived) DataReceived(this, EventArgs.Empty); 

}

هذا مخطط تقريبي. لكن الفكرة الأساسية هي أنك تفعل ما يمكنك محليا في مؤشر ترابط الخلفية. ثم يمكنك إعلام UI من خلال حدث.

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