سؤال

وأنا بحاجة إلى تشغيل FileSystemWatcher في حلقة لا نهائية لمراقبة ملف التغييرات، ولكن هذا الملف تغيير فقط كل بضعة أيام، وربما مرة واحدة فقط في الأسبوع. في العينة MSDN من FileSystemWatcher و هناك حلقة في حين أن المستخدم لا يدخل ف في وحدة التحكم:

while(Console.Read()!='q');

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

while (true);

وهكذا موضوع لا يخرج؟ وهذا وحده ليست مثالية كما أنه سيتم ربط وحدة المعالجة المركزية - إضافة <قوية> Thread.Sleep اتصال شأنها أن تقضي على الحمل وحدة المعالجة المركزية، وفي هذه الحالة، يمكن أن يكون النوم الطويل مثل ملف نادرا ما يتغير. هل هذه هي أفضل طريقة للذهاب؟ كيف أتأكد من هذا الموضوع لا يزال على قيد الحياة حتى FileSystemWatcher يمكن أن تعمل عند تغيير الملف؟ هذا يعمل على خادم ويندوز (مع صافي إطار الإصدار 2.0)، لذلك يجعل من خدمة Windows سيكون ممكنا إذا لزم الأمر.

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

المحلول

إذا هذا يعمل على الخادم، ويبدو أن خدمة مثل رهان جيد.

إذا كنت تريد شيئا قليلا أكثر تفاعلا، ولدي تطبيق الصغيرة التي تعيش في علبة النظام جهدي لتظهر لي عندما يحدث شيء في مجلد قضايانا. فإنه يستخدم الأسلوب Application.Run () للحفاظ على نفسها الذهاب من دون الحاجة إلى وجود حلقة، أي

class MainEntryClass
{
    static void Main(string[] args)
    {
        FolderAlerter fa = new FolderAlerter(); 
        Application.Run();
    }
}

وبعد ذلك أقوم بإعداد بلدي FileSystemWatcher في FolderAlerter.

نصائح أخرى

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

وهناك طريقة بسيطة لعمل ما تريد هي لجعل هذا التغيير إلى عينة من MSDN.

//while (Console.Read() != 'q') ;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

وهذا سوف يضع موضوع الرئيسي الخاص بك إلى النوم إلى الأبد، ولكن لا تزال تسمح المندوبين لاطلاق النار والاستجابة للتغيرات في الدليل. لاحظ أنه سيبقي يمر عبر عدة تغييرات (تماما مثل العينة MSDN).

لاحظ أن "في حين أن" في العينة MSDN لا حقا تفعل الكثير. هل يمكن الاستعاضة عن ذلك تمشيا مع "Console.Read ()" فقط، وهو ما جعل ثم أي مفتاح إنهاء التطبيق. انها مجرد خط لوقف الترابط الرئيسي من الخروج بحيث لا يزال موجودا عندما تأتي الإخطارات الحدث في.

ومع ذلك، باستخدام النوم (Timeout.Infinite) يترك التطبيق الخاص بك في حالة حيث أنه لا يمكن وقفها بسهولة من قبل المستخدم، وغيرها من خلال قتل التطبيق. إذا كنت تكتب في ذلك التطبيق وحدة التحكم، لماذا لا العصا مع "Q الصحافة لإنهاء"؟ إذا قررت أن أكتب كخدمة بدلا من ذلك سوف يكون على الأرجح يرام، طالما كنت معالجة الأحداث اغلاق / استئناف الخ.

لذلك، وربما كنت ترغب في إنشاء ManualResetEvent في حالة إعادة تعيين ويكون لديك موضوع WaitOne() الرئيسي على ذلك. لإنهاء بعض الاستدعاء أخرى يمكن ببساطة Set() الحدث الذي يؤدي WaitOne() للعودة.

وسسنترنلس (مملوكة الآن من قبل مايكروسوفت) وفيلمون والتي سوف تعطيك ما تحتاج إليه، مع المصدر.

ونقلا عن الموقع

<اقتباس فقرة>   

وقلب فيلمون هو في الظاهرية   برنامج تشغيل الجهاز، Filevxd.vxd. أنه   تحميل حيوي، ولها   التهيئة ذلك بتثبيت ملف   مرشح النظام عبر خدمة محمل،   IFSMGR_InstallFileSystemApiHook، ل   إدراج نفسها على سلسلة نداء   جميع طلبات نظام الملفات.

وثنائيات ومصادر يمكن العثور عليها هنا: http://technet.microsoft كوم / EN-US / سسنترنلس / bb896642.aspx

هل يمكن استخدام Thread.Sleep لتجنب حلقة فارغة. ومع ذلك، في حال مثلا نظام تمهيد سيتم إعادة تشغيل خدمة Windows تلقائيا. وثمة نهج آخر، وهذا يتوقف على كيفية هندستها بقية البرنامج / النظام هو استخدام ويندوز جدولة لتشغيل المنطق الاقتراع في ملف .exe منفصلة.

إذا كنت تبحث عن حل قوي / مرونة، إما خدمة Windows أو النهج القائم على جدولة التشغيل Windows تبدو الأفضل.

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