سؤال

لديّ تطبيق نموذج Windows مكتوب في C# أستخدم فيه ملف fileystemwatcher لمراقبة مجلد للملفات الجديدة ثم إجراء بعض المعالجة عليها. تم تصميم طلبي لتشغيله في علبة النظام ، وبالتالي لا يقوم بتثبيت أي نماذج عند بدء التشغيل. تكمن المشكلة في أن الحدث الذي تم إنشاؤه هو إطلاق النار على مؤشر ترابط منفصل ، وعندما أحاول إنشاء مثيل للنموذج في الحدث الذي تم إنشاؤه ، أحصل على threadStateException بأنني بحاجة إلى الركض في SingleThreadApartment. أعتقد أنني بحاجة إلى تعيين خاصية FileSystemWatcher.synchronizingObject ولكن لا أعرف ما الذي يجب استخدامه نظرًا لعدم وجود نموذج رئيسي في طلبي.

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

المحلول

سيتعين عليك استدعاء Application.Run () بطريقة رئيسية () للحصول على آلات Synchronziation Synchronziation في مكانها بحيث يمكن لـ FileSystemWatcher تنظيم الدعوة إلى الخيط الرئيسي بشكل صحيح. المشكلة التي تواجهها آنذاك هي أن النموذج الرئيسي سيصبح مرئيًا. إصلاح ذلك عن طريق لصق هذا الرمز في الفصل:

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            this.CreateHandle();
            value = false;
        }
        base.SetVisibleCore(value);
    }

لا توجد قيود على شكل النموذج الخاص بك إذا قمت بذلك.

نصائح أخرى

لا تحتاج إلى تمرير أي نماذج إلى Application.Run على الاطلاق. ثم يمكنك حفظ الاضطرار إلى العبث مع رؤية النموذج. فقط افعل هذا:

var InvokerForm = new Form();
var dummy = InvokerForm.Handle; // force handle creation
Application.Run();

واحد فقط من مسكات واحدة - يجب إجبار إنشاء مقبض النماذج على الوصول إليه مرة واحدة.

أبسط طريقة للقيام بذلك هي صنع شكل خفي ونقله إليه Application.Run.

يمكنك بعد ذلك تعيين ملف SynchronizingObject خاصية إلى النموذج المخفي.

للتأكد من أنه شكل مخفي ، قم بتعيين ControlBox و ShowInTaskbar خصائص إلى خطأ.

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