أفضل الممارسات الاتصالات غير المتزامنة في MVP مع WinForms

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

سؤال

أنا باستخدام نموذج عرض مقدم نمط في WinForms المشروع مشكلة واحدة (من بين العديد من) أن أواجه عندما شكل يحكي مقدم على فعل شيء ثم هو الامم المتحدة رد الفعل حين مقدم يذهب من أن تفعل ذلك.لحسن الحظ في مشروعي ليس لدي أي مشكلة مع تقديم كل مقدم المكالمات غير متزامن السؤال هو بالضبط كيف نفعل ذلك ؟

يجب على كل مقدم الدعوة فقط تكون ملفوفة في موضوع جديد الخلق ؟ *

new Thread(()=>_presenter.DoSomething()).Start();

ما هي أفضل الممارسات هنا ؟ ما إذا كان المستخدم بالضغط على "إحباط ما تفعله" الزر ؟ كيف يمكنني إحباط باحترام ؟

.* واقعيا ربما أنا فقط استخدام نوع من الوكيل على مقدم للقيام بذلك بدلا من وضع موضوع إنشاء في WinForm

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

المحلول

وأنا يمكن أن يدعي ذلك فحسب لقد فكرت في هذه (القراءة قبل سؤالك؛). أولا فما استقاموا لكم فاستقيموا تلاعب في الأماكن التي يهم هذا الواقع. على سبيل المثال وصول ممرا DB. إذا كان هناك مكان لا ينبغي تنفيذها في سياق "UI" (يمكنك حفظه من <لأ href = "http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.current .aspx اتصال "يختلط =" نوفولو noreferrer "> http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.current.aspx في موضوع UI ثم قارن وقت لاحق لعدم UI- السياق تزامن) ثم Debug.BitchAndMoan () حول هذا الموضوع. أي حسابات أطول (والذي "يجب" أن يكون كل فصل بشكل واضح في الفتحات الخاصة بها، والحق؛). وينبغي التأكيد على أن

وأعتقد أنك يجب على الأقل أن نوع تنفيذ وظيفة مقدم شكلي عبر السمة التي يتم بعد ذلك يطاع من قبل الوكيل. (فقط في حال كنت تريد القيام بشيء ما بطريقة المسلسل).

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

.

وتجربتي هي أن هذا عادة ما يكون مجرد عمل حول باستخدام أحداث (نمط SCSF). إذا فعل ذلك من نقطة الصفر، وكنت أذهب الطريق الوكيل منذ كان SCSF ألم في نواح كثيرة لدرجة أنني أشك التعقل مصمميها.

نصائح أخرى

وعادة ما تضع أي عمل يمكن أن (واقعيا) يستغرق أكثر من ثانية أو ثانيتين في مهمة منفصلة ، شيء من هذا القبيل:

public interface ITask
{
    void ExecuteTask (ITaskExecutionContext context);
    void AfterSuccess(ITaskExecutionContext context);
    void AfterFailure(ITaskExecutionContext context);
    void AfterAbortion(ITaskExecutionContext context);
}

أود أيضا أن يكون مجردا عن تشغيل هذه المهام:

public interface ITaskExecutor : IDisposable
{
    void BeginTask(ITask task);
    void TellTaskToStop();
}

واحدة من تطبيقات هذا ITaskExecutor يستخدم BackgroundWorker:

public class BackgroundTaskExecutor : ITaskExecutor
{
    public void BeginTask(ITask task)
    {
        this.task = task;
        worker = new BackgroundWorker ();
        worker.DoWork += WorkerDoWork;
        worker.RunWorkerCompleted += WorkerRunWorkerCompleted;
        worker.WorkerSupportsCancellation = true;

        worker.RunWorkerAsync();
    }

    ...
}

أنا كبير تعتمد على حقن التبعية واللجنة الأوقيانوغرافية الحكومية الدولية إلى سلك الأشياء معا.في مقدم ثم أتصل شيئا مثل:

GoAndDontReturnUntilYouBringMeALotOfMoneyTask task = new GoAndDontReturnUntilYouBringMeALotOfMoneyTask(parameters);
taskExecutor.BeginTask(task);

إلغاء/إحباط الأزرار ثم السلكية لذلك يقولون منفذ المهمة / المهام إلى إحباط.

انها في الواقع أكثر تعقيدا من المقدمة هنا ، ولكن هذه هي الفكرة العامة.

لماذا لا تجعل من نمط وكيل استخدام قبول اثنين من ظهورهم الدعوة لإرجاع النتائج أو إحباط؟

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