Process.Creat بطيئة عند التفريخ المزيد من العمليات الجديدة

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

سؤال

العمليات التي تم إطلاقها عبر Process.Start يبدو أن هناك حوالي 26 ثانية تأخير عندما تطلق العملية الممتازة ("الطفل") المزيد من العمليات الجديدة ("الأحفاد") - أحاول إيجاد طريقة لحل هذه المشكلة. على وجه التحديد ، يحدث هذا عندما تكون العملية الأصلية ("الوالد") موقع ويب ASP.NET أو خدمة Windows (تمت تجربتهما).

نحاول تشغيل أداة سطر الأوامر من جانب الخادم لجمع المعلومات ، وإجراء تعديلات في نظام الملفات ، والمتابعة مع عمليات أخرى عند الانتهاء من "الطفل". عند إنشاء "الطفل" مباشرة عبر سطر الأوامر ، لا يوجد تأخير ، ومع بعض معلمات سطر الأوامر ، لا يفرز "الطفل" عمليات جديدة ، ولا يوجد تأخير. ومع ذلك ، مع المعلمات الأخرى ، يولد "أحفاد" "الطفل" (القابل للتنفيذ نفسه كما هو الحال ، لكن لا يمكننا تعديل رمزه) ويبدو أن لدينا تأخير 25-30 ثانية (عادة 26 ثانية) قبل العملية الأولى بدأ ، ثم يركض بشكل طبيعي.

لقد حاولت تعديل UseShellExecute الممتلكات ، CreateNoWindow الممتلكات ، و WindowStyle الخاصية ، دون أي تأثير. ErrorDialog و ال RedirectStandard* الخصائص خاطئة.

الرمز الذي أستخدمه كما يلي:

using (Process p = new Process())
{
    p.StartInfo = new ProcessStartInfo(exePath, args)
    {
        WorkingDirectory = workingDirectory,
        UseShellExecute = true,
        CreateNoWindow = true,
    };
    p.Start();
    p.WaitForExit();
}

أوه ، لا أعتقد أن الأمر يهم كما رأيت المشكلة المشار إليها في مكان آخر (ولكن لا توجد حلول) ، لكن exepath أستخدم نقاطًا إلى git.exe من msysgit.

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

المحلول

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

أود أن أقترح عليك استخدام Explorer و Process Monitor للبحث عن المشكلات المحتملة.

أظن أن المشكلة ليست مباشرة في الكود الخاص بك ولكنها أكثر صلة ببيئة المستخدم. على سبيل المثال ، تعمل عملية W3WP.exe في جلسة غير GUI (الجلسة 0) وقد لا يتم تكوين المستخدم للحصول على وصول على الويب (تكوين الوكيل) بحيث يمكنك رؤية مشكلة مهلة هنا.

نصائح أخرى

واجهت نفس المشكلة الدقيقة التي تنفذ ملف .bat والذي بدوره إجراء مكالمة إلى git.cmd باستخدام Process.start من خدمة Windows. سيتم تنفيذ أمر GIT على الفور إذا تم تشغيل ملف .bat مباشرة من سطر الأوامر ، ولكنه سيؤخر بالضبط 50 ثانية في أي وقت تم استدعاؤه من خدمة Windows.

لقد وصل الأمر إلى قضية الأذونات. بعد تكوين خدمة Windows الخاصة بي لتشغيلها كمستخدم (المسؤول في حالتي) ، تم تشغيل عملية GIT على الفور. ربما يمكنك تعديل تثبيت الخدمة الخاص بك لتشغيل الخدمة كـ "مستخدم" ، ولكن يمكنك فقط تعديل خصائص الخدمة بعد تثبيتها بنفس التأثير.

قد تكون هناك طرق لتمكين "الخدمة المحلية" للتغلب على التأخير ، لكنني لا أعرف كيف.

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