2012-04-27 34 views
26

cách thêm độ trễ giữa các dự án khởi động trong giải pháp?Sự chậm trễ của Visual Studio giữa nhiều dự án khởi động?

enter image description here

Tôi muốn dự án Khách hàng được bắt đầu sau 2-3 giây từ khi bắt đầu WindowsService.

Tại sao tôi cần điều này?

WindowsService chạy máy chủ ổ cắm và Ổ cắm máy khách để kết nối với máy chủ. WindowsService tải chậm hơn Client và điều này gây ra một ngoại lệ về phía máy khách khi kết nối đến máy chủ mà không chạy được

+23

Khắc phục sự cố trong mã của bạn, điều này cũng sẽ xảy ra trong cuộc sống thực. –

+0

Trong cuộc sống thực Máy chủ đang chạy trên máy nhanh hơn :) – Lev

+0

là cả hai ứng dụng này có sẵn trên cùng một máy? –

Trả lời

26

Tôi có thể thêm cơ chế thử lại trong ứng dụng khách. Bằng cách đó, nó không chỉ giúp ích trong trường hợp "khởi động từ Visual Studio" - nó cũng giúp nếu máy chủ xảy ra khi khởi động lại trong khi máy khách thực sự kết nối. Thực tế là máy chủ trên một máy nhanh hơn không có nghĩa là máy chủ sẽ không bao giờ cần phải khởi động lại, phải không? Thực tế, bạn cũng có thể muốn thêm cơ chế thử lại này theo cách sao cho máy khách có thể khôi phục ngay cả khi máy chủ được khởi động lại trong khi nó được kết nối. Nó phụ thuộc vào những gì dự án đang làm, tất nhiên.

+1

bất kỳ mẫu đầy đủ nào về cơ chế Thử lại? – Kiquenet

+0

@Kiquenet: Không, nhưng không quá khó để đặt mã kết nối trong vòng lặp ... –

5

Nếu khách hàng cần được bắt đầu sau đó, bạn cần phải điều chỉnh danh sách của bạn, tại thời điểm này đã bắt đầu trước đó!

Tôi cũng sẽ viết mã "/ wait" khi tải ứng dụng nếu thấy cờ đó, đợi nó có thể hữu ích khi sử dụng.

+0

Nó chỉ điều chỉnh để bắt đầu đầu tiên, không chậm trễ giữa chúng! – Lev

+0

có, do đó các chương trình tiếp theo có tùy chọn/wait: P mà bạn có thể sử dụng thuần túy như một tính năng không có giấy tờ hoặc chọn để xuất bản .. thay đổi thứ tự bắt đầu là hoàn toàn khả thi, bạn có thể nói/đợi 1000 hoặc chỉ/chờ và chỉ có một số mã bạn sử dụng để gây ra sự chậm trễ mà bạn muốn làm việc. – BugFinder

13

Bạn có thể sử dụng khóa Mutex để đồng bộ hóa hai dự án khởi động.

Chương trình 1 (StartUp Project 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(); 
      } 
     } 

    } 
} 

Chương trình 2 (StartUp Dự án 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

Tại sao bạn không chỉ cần vượt qua một đối số cho khách hàng ứng dụng nào đặt độ trễ?

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

    // Initialize client 
} 

Bây giờ bạn có thể thêm độ trễ bằng mili giây vào đối số dòng lệnh để khởi động dự án.

Tôi cũng đồng ý rằng nếu có thể, tốt hơn là nên giải quyết vấn đề của bạn một cách có cấu trúc, do đó, việc khách hàng và máy chủ của bạn bắt đầu không quan trọng.

3

Bạn có thể thiết lập các dự án máy chủ như các dự án khởi động duy nhất và sử dụng macro này để khởi động máy chủ và máy khách với một sự chậm trễ:

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 

Bạn có thể thêm một nút vào thanh công cụ của bạn hoặc sử dụng một phím tắt để chạy macro này.

8

Trong trường hợp có nhiều dự án khởi động, chúng được tải theo thứ tự được chỉ định không đồng thời hoặc ngẫu nhiên.enter image description herehttp://msdn.microsoft.com/en-us/library/09138bex(v=vs.90).aspx

Vì vậy, có thể nếu bạn chỉ định "khách hàng" sau "dịch vụ cửa sổ" thì có thể hoạt động tốt. Và nếu bạn không muốn có cách mã hóa được đề xuất ở trên, thì (đối với chỉ thử nghiệm), bạn có thể đính kèm quy trình "khách hàng" theo cách thủ công cho bạn giải pháp từ một giải pháp khác sau khi bạn muốn chậm trễ. http://msdn.microsoft.com/en-us/library/c6wf8e4z(v=vs.100).aspx

0

Chỉ cần thêm quy trình để kiểm tra xem ổ cắm có đang mở hay không. Nếu socket đang mở tiếp tục thực thi mã của bạn và thử kiểm tra lại nếu socket không mở. Bằng cách này, ngay cả khi bạn bắt đầu dịch vụ windows sau đó sẽ không có vấn đề gì.

7

Một tùy chọn khác đơn giản hơn để thử nghiệm là chỉ cần trì hoãn việc khách hàng nếu debugger được gắn như thế này:

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

Bạn có thể quấn rằng trong một khối #if DEBUG nếu bạn muốn. Dù sao tôi nghĩ rằng điều này nên là số tiền ít nhất của công việc :)

0

Đối với ứng dụng n-tier tôi hiện đang làm việc, tôi kết hợp phương pháp Mutex được đề xuất bởi Romil (mã hơi khác nhau nhưng cùng một nguyên tắc) và đóng gói nó trong một phương pháp với một [Áp dụng ("DEBUG")] thuộc tính áp dụng (vì vậy nó bị tước ra trong chế độ phát hành). Chúng tôi cũng bao quanh logic mutex nếu (System.Diagnostics.Debugger.IsAttached) {...} kể từ khi QA xây dựng sử dụng chế độ Debug. Chúng tôi ban đầu chỉ sử dụng Thread.Sleep với thời gian chờ làm việc cho hầu hết các máy phát triển, nhưng chúng tôi gặp phải vấn đề vì tốc độ máy tính khác nhau và khi chúng tôi thêm ngày càng nhiều vào bootstrapper của máy chủ, chúng tôi phải giữ tăng thời gian chờ đợi.

Các vấn đề liên quan