2012-04-27 14 views
26

कैसे समाधान में स्टार्टअप परियोजनाओं के बीच कुछ देरी जोड़ने के लिए?एकाधिक स्टार्टअप परियोजनाओं के बीच विजुअल स्टूडियो देरी?

enter image description here

मैं ग्राहक परियोजना WindowsService प्रारंभ होने से 2-3 सेकंड के बाद शुरू किया जा करना चाहते हैं।

मुझे इसकी आवश्यकता क्यों?

WindowsService सॉकेट सर्वर चलाता है और ग्राहक सर्वर से कनेक्ट करने सॉकेट चलाता है। WindowsService धीरे क्लाइंट से लोड होता है और जब सर्वर से कनेक्ट जो अभी तक

+23

अपने कोड में समस्या को ठीक करें, यह वास्तविक जीवन में भी होने वाला है। –

+0

वास्तविक जीवन में सर्वर अधिक तेज मशीन पर चल रहा है :) – Lev

+0

क्या ये दोनों एप्लिकेशन एक ही मशीन पर उपलब्ध हैं? –

उत्तर

26

मैं शायद क्लाइंट के भीतर एक पुनः प्रयास तंत्र जोड़ना होगा। इस तरह से यह न केवल "विजुअल स्टूडियो से शुरू होने" मामले में मदद करता है - यह भी मदद करता है यदि वास्तविक क्लाइंट कनेक्ट होने पर सर्वर पुनरारंभ होता है। तथ्य यह है कि सर्वर एक तेज मशीन पर है इसका मतलब यह नहीं है कि सर्वर को फिर से शुरू करने की आवश्यकता नहीं होगी, है ना?

दरअसल, आप अच्छी तरह से इस तरह से है कि ग्राहक भले ही सर्वर जबकि यह जुड़ा हुआ है पुनरारंभ ठीक हो सकता है में यह पुन: प्रयास तंत्र जोड़ सकते हैं। यह इस बात पर निर्भर करता है कि परियोजना क्या कर रही है।

+1

पुनः प्रयास तंत्र के बारे में कोई पूर्ण नमूना? – Kiquenet

+0

@Kiquenet: नहीं, लेकिन एक लूप के भीतर कनेक्शन कोड डालना मुश्किल नहीं है ... –

5

नहीं चला है ग्राहक के बाद शुरू किया जा करने की जरूरत है अगर यह क्लाइंट की तरफ एक अपवाद का कारण बनता है, तो आप अपने सूची समायोजित करने की आवश्यकता इस समय के रूप में अपनी पहले शुरू किया!

मैं भी एक "/ प्रतीक्षा" जो लोड हो रहा है एप्लिकेशन पर अगर यह है कि झंडा पाता कोड होता है, भी हो सकता है उपयोग में उपयोगी इसके लिए इंतजार कर रहा है।

+0

यह केवल समायोजित करता है जो पहले शुरू करने के लिए, उनके बीच देरी नहीं! – Lev

+0

हां, इसलिए बाद के कार्यक्रमों में एक/प्रतीक्षा विकल्प होता है: पी जिसे आप या तो एक अनियंत्रित सुविधा के रूप में पूरी तरह से उपयोग कर सकते हैं, या प्रकाशित करना चुन सकते हैं .. प्रारंभ क्रम को बदलना व्यावहारिक है, आप इसे 1000/बस प्रतीक्षा/प्रतीक्षा कर सकते हैं और प्रतीक्षा कर सकते हैं और बस कुछ कोड जो आप उपयोग करने के लिए इच्छित देरी के कारण उपयोग करते हैं। – BugFinder

13

आप Mutex दो स्टार्टअप परियोजना सिंक करने के लिए ताला लगा उपयोग कर सकते हैं।

कार्यक्रम 1 (स्टार्टअप परियोजना 1):

namespace ConsoleApplication1 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading; 

    class Program1 
    { 
     private static bool isNewMutexCreated = true; 
     private static Mutex mutex; 
     static void Main(string[] args) 
     { 
      mutex = new Mutex(true, "Global\\ConsoleApplication1", out isNewMutexCreated); 
      AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); 
      Console.WriteLine("Application1 executed on " + DateTime.Now.ToString()); 

      Console.ReadKey(); 
     } 

     static void CurrentDomain_ProcessExit(Object sender, EventArgs e) 
     { 
      if (isNewMutexCreated) 
      { 
       Console.WriteLine("Mutex Released"); 
       mutex.ReleaseMutex(); 
      } 
     } 

    } 
} 

कार्यक्रम 2 (स्टार्टअप परियोजना 2):

namespace ConsoleApplication2 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.IO; 
    using System.Threading; 

    class Program2 
    { 
     static void Main(string[] args) 
     { 
      Mutex mutex = null; 
      Thread.Sleep(5000); 

      while (mutex == null) 
      { 
       try 
       { 
        mutex = Mutex.OpenExisting("Global\\ConsoleApplication1"); 

       } 
       catch (Exception) 
       { 
        Console.WriteLine("Mutex not found on " + DateTime.Now.ToString()); 
        Thread.Sleep(3000); 
       } 


      } 
      Console.WriteLine("Application2 executed on " + DateTime.Now.ToString()); 
      Console.ReadKey(); 
     } 
    } 
} 
0

आप क्यों नहीं बस ग्राहक के लिए एक तर्क उत्तीर्ण नहीं होते हैं आवेदन जो देरी सेट करता है?

static void main(string[] args) 
{ 
    // Sleep some time 
    int delay; 
    if (args.Length > 0 && int.TryParse(args, out delay)) 
    { 
    Thread.Sleep(delay); 
    } 

    // Initialize client 
} 

अब आप परियोजना स्टार्टअप के लिए कमांड लाइन तर्कों में मिलीसेकंड में देरी जोड़ सकते हैं।

मैं भी मानता हूँ कि यदि संभव हो तो, यह संरचनात्मक रूप से अपनी समस्या को हल करने के लिए बेहतर है, तो यह कोई फर्क नहीं पड़ता है जब आपके क्लाइंट और सर्वर शुरू।

3

आप एकल स्टार्टअप परियोजना के रूप में सर्वर परियोजना की स्थापना की और देरी से सर्वर और ग्राहक लांच करने के लिए इस मैक्रो का उपयोग कर सकते हैं:

Sub DebugServerAndClientWithDelay() 
    DTE.Debugger.Go(False) 
    System.Threading.Thread.Sleep(2000) 
    DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() 
    DTE.ActiveWindow.Object.GetItem("SolutionName\ClientProjectName").Select(vsUISelectionType.vsUISelectionTypeSelect) 
    DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance") 
End Sub 

आप अपने टूलबार में एक बटन जोड़ने के लिए या एक शॉर्टकट कुंजी का उपयोग कर सकते हैं इस मैक्रो को चलाने के लिए।

8

कई स्टार्ट-अप परियोजनाओं के मामले में, वे क्रम में वे निर्दिष्ट कर रहे हैं न एक साथ है और न ही बेतरतीब ढंग से में लोड किए गए हैं।enter image description herehttp://msdn.microsoft.com/en-us/library/09138bex(v=vs.90).aspx

तो, यदि आप "विंडो सेवा" के बाद "क्लाइंट" निर्दिष्ट करते हैं, तो यह कसरत ठीक हो सकता है। और यदि आप ऊपर सुझाए गए कोड किए गए तरीके को नहीं प्राप्त करना चाहते हैं, तो (केवल परीक्षण के लिए) आप अपनी वांछित देरी के बाद एक अलग समाधान से समाधान के लिए "क्लाइंट" प्रक्रिया मैन्युअल रूप से संलग्न कर सकते हैं। http://msdn.microsoft.com/en-us/library/c6wf8e4z(v=vs.100).aspx

0

यह जांचने के लिए बस एक प्रक्रिया जोड़ें कि सॉकेट खुला है या नहीं। यदि सॉकेट खुला है तो अपना कोड निष्पादित करना जारी रखें और सॉकेट खुला नहीं होने पर पुनः जांचने का प्रयास करें। इस तरह यदि आप विंडोज़ सेवा शुरू करते हैं तो भी कोई समस्या नहीं होगी।

7

के परीक्षण के लिए एक और सरल विकल्प सिर्फ अगर डिबगर इस तरह जुड़ा हुआ है ग्राहक देरी करने के लिए है:

if (System.Diagnostics.Debugger.IsAttached) 
{ 
    System.Threading.Thread.Sleep(2000); 
} 

आपको लगता है कि हो सकता है लपेट एक #if DEBUG ब्लॉक में यदि आप चाहें। वैसे भी मुझे लगता है कि यह कम से कम काम होना चाहिए :)

0

एन-स्तरीय एप्लिकेशन के लिए मैं वर्तमान में काम कर रहा हूं, मैंने रोमिल द्वारा सुझाए गए म्यूटेक्स विधि को जोड़ दिया (थोड़ा अलग कोड लेकिन एक ही सिद्धांत) और इसे एक के भीतर encapsulated एक [सशर्त ("DEBUG") विशेषता के साथ विधि लागू (इसलिए यह रिलीज मोड में छीन लिया जाता है)। अगर हम क्यूए डीबग मोड का उपयोग करते हैं तो हम म्यूटेक्स तर्क को भी घेरते हैं (System.Diagnostics.Debugger.IsAttached) {...}।

हम मूल रूप से सिर्फ एक प्रतीक्षा अवधि है कि ज्यादातर डेवलपर्स मशीनों के लिए काम किया साथ एक Thread.Sleep इस्तेमाल किया है, लेकिन क्योंकि devs 'कंप्यूटर की गति अलग-अलग हो हम समस्याओं में भाग गया और जैसा कि हम अधिक से अधिक सर्वर bootstrapper को जोड़ा गया है, हम रखना था प्रतीक्षा अवधि में वृद्धि।

संबंधित मुद्दे