سؤال

لنفترض أن لديك ملفًا تقوم بتسجيل المعلومات برمجيًا فيما يتعلق بعملية ما. كيندا مثل وحدة التحكم في التصحيح النموذجي الخاص بك ، ولكن بسبب طبيعة الكود الذي تختبره ، ليس لديك وحدة تحكم لكتابتها حتى تضطر إلى كتابتها في مكان ما مثل ملف. يستخدم برنامجي الحالي System.io.streamWriter لهذه المهمة.

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

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

المحلول

يؤدي فتح/إغلاق DreamWriter الجديد لكل كتابة إلى إنشاء الكثير من الموارد لـ GC Plus فرض النفقات العامة على التطبيق بسبب البحث الفعلي للملف لكل عملية مفتوحة. من ناحية أخرى ، فإن حمل دفق واحد مفتوح سيحمل قفلًا على الملف. لذلك يعتمد.

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

كنت أتابع نموذج log4net ، وإنشاء دفق سجل ثابت ، والكتابة إلى تلك المفرد. انظر إلى log4net على أي حال ، لذلك لا تتدحرج بنفسك. http://logging.apache.org/log4net/index.html

نصائح أخرى

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

أود أن أقوم بتخزين/طابور البيانات والكتابة إلى الملف بمجرد أن يصل إلى عتبة وتدفق قائمة الانتظار بأكملها عندما يغلق التطبيق/يخرج بشكل طبيعي.

المشكلة الوحيدة في هذا في حالة تعطل التطبيق ، قد تفقد العناصر الموجودة في قائمة الانتظار ...

HTH.

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