سؤال

أبقى بعيدًا عن التطبيق. لقد فضلت منذ فترة طويلة القيام بأعمال الخلفية في الحدث Application. ولكن ، بالنسبة للمهام طويلة الأمد ، هل من المقبول تشغيل العمليات في التطبيق. مع حلقة doevents؟

class LongRunningTask : IDisposable {

    public LongRunningTask(IEnumerable<Tidbit> listOfDataToBeProcessed) {
       Application.Idle += OnIdle;

        foreach(Tidbit t in listofDataToBeProcessed) {
            tidbits.Enqueue(t);
        }
    }

    // Small pieces of data to process
    Queue<Tidbit> tidbits = new Queue<Tidbit>();

    void OnIdle(object sender, EventArgs e) {
        while(tidbits.Count > 0) {
            var tidbit = tasks.Dequeue();
            tidbit.Process();
            // Process any messages that have queued up
            // while the data was being processed
            Application.DoEvents();
        }
    }

    public void Dispose() {
        Application.Idle -= OnIdle;
    }
}

المنطق هنا هو أنه في الحدث. ستتم معالجة كل sitbit بسرعة كافية بحيث لا يجب أن يحمل قائمة انتظار الرسائل (أو واجهة المستخدم) بشكل كبير.

إذن ، هل هناك أي ضرر أو عيب في هذا النهج؟ وهي ، هل من الآمن استدعاء doevents في حدث الخمول؟ أنا أعرف ذلك سيكون C# 5 ميزة لمعالجة هذا النوع من المواقف, ، ولكن بالنسبة لأولئك منا الذين لا يستخدمون C# 5 (وهو معظمنا في الوقت الحالي) ، وبدافع الفضول العام ، هل هذه خطة جيدة؟ أم أن هناك بديلاً أبسط لمعالجة الرسائل أثناء عملية طويلة الأمد دون اللجوء إلى متعدد الخيوط؟

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

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

المحلول

ما تفعله هنا يشبه إلى حد كبير تعدد المهام التعاونية. إنها فكرة مثيرة للاهتمام ، لكنني أقول أنه يجب عليك حقًا استخدام الخيوط المتعددة لشيء من هذا القبيل. .NET لديه الكثير من أنظمة المساعد مثل Task.Factory.StartNew() ومكتبات TPL التي تجعل الأمر سهلاً حقًا.

أنصح بعدم فعل هذا.

لكي أكون واضحا: ليس لدي سبب واضح ضدها. كما هو الحال مع الكثير من المجالات المتعلقة بالبرمجة: إذا نجحت ، فهي تعمل. ومع ذلك ، فأنت تقوم بخلط الأشياء معًا التي لا ينبغي خلطها معًا ، وتحديداً مهام الخلفية ومهام واجهة المستخدم. أعتقد أنه عندما تفصل مهام الخلفية وتبدأ ، احصل على يديك متسخًا مع الخيوط المتعددة ، وحمامات الخيوط ، ومهام الخلفية ، و TPL ، سترى بسرعة أنها تعمل وتجعل الحياة أسهل على المدى الطويل.

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