2011-09-13 41 views
11

Tôi có một Dịch vụ Windows mà tôi đang cố gỡ lỗi. Bây giờ nó không bắt đầu ngay cả khi mã hiện tại được sử dụng để làm việc. Lỗi này là:Dịch vụ Windows sẽ không khởi động (Lỗi 1053)

Windows không thể khởi động dịch vụ MyService trên Local Computer

Lỗi 1053: Dịch vụ này đã không trả lời khi bắt đầu hoặc kiểm soát yêu cầu một cách kịp thời.

Để cách ly lỗi, tôi đã cố gắng nhận xét mọi thứ. Phương pháp chính trông giống như sau:

TextWriter tt = new StreamWriter(@"C:\startup.text", true); 
tt.WriteLine("Starting up the service"); 
tt.Close(); 

ServiceBase[] ServicesToRun; 
ServicesToRun = new ServiceBase[] 
    { 
     new MyService() 
    }; 

TextWriter tt2 = new StreamWriter(@"C:\startup.text", true); 
tt2.WriteLine("Run..."); 
tt2.Close(); 

Nó in cả "Khởi động dịch vụ" và "Chạy ..." vào tệp nhật ký. Tôi cũng đã lột bỏ bên trong MyService để nó trống. Có một thử/nắm bắt xung quanh bất kỳ mã, mà bây giờ được giảm xuống một số dòng đăng nhập như trên. Tôi không bao giờ đi vào câu lệnh khai thác, nó sẽ ghi lại nó.

Mọi thứ trong OnStart đã được nhận xét ra:

protected override void OnStart(string[] args) 
{ 
} 

Vì vậy, tôi về cơ bản ra khỏi ý tưởng. Tôi nghĩ rằng lỗi là vì phương pháp Bắt đầu không bao giờ kết thúc (hoặc không trong vòng 30 giây). Có một số phương pháp khác được gọi là? Bất kỳ ý tưởng được đánh giá cao.

Thông tin thêm: Hàm tạo trong MyService trống. Nếu tôi chèn một số dòng Thread.Sleep (5000), sau đó nó mất lâu hơn beofre thông báo lỗi về lỗi 1053 bật lên. Phương pháp chính dường như phải thoát (không có lỗi).

+0

Đảm bảo bạn nắm bắt tất cả các ngoại lệ chưa được xử lý và ghi m vào nhật ký của bạn. Ví dụ: http://stackoverflow.com/questions/58280/unhandledexception-handler-in-a-net-windows-service ... có thể cung cấp cho bạn một số thông tin khác về lý do tại sao nó không thành công. –

Trả lời

15

Bạn đang thiếu ServiceBase.Run gọi:

ServiceBase[] servicesToRun = new ServiceBase[] 
           { 
            new MyService() 
           }; 
ServiceBase.Run(servicesToRun); 

Nó cũng có thể là một ý tưởng tốt để đăng ký unhandled ngoại lệ thông báo:

static void Main() { 
    ... 
    AppDomain.CurrentDomain.UnhandledException 
             += CurrentDomain_UnhandledException; 
    ... 
} 

private static void CurrentDomain_UnhandledException(
               Object sender, 
               UnhandledExceptionEventArgs e) { 

    if (e != null && e.ExceptionObject != null) { 
     // log exception: 
    } 
} 

Và thêm sau try/catch để OnStart vì .NET/SCM nuốt các ngoại lệ:

protected override void OnStart(String[] args) { 
    try { 

    } catch(Exception e) { 
     // log exception: 
     throw; 
    } 
} 
+1

Ngoài ra nếu bạn muốn gỡ lỗi khởi tạo dịch vụ, bạn có thể thực hiện cuộc gọi đến System.Diagnostics.Debugger.Break() trong mã khởi tạo. Khi dòng này đạt đến Windows sẽ hỏi bạn nếu bạn muốn khởi động trình gỡ lỗi, điều này sẽ cho phép bạn gỡ lỗi dịch vụ từ điểm đó. – Polyfun

+1

Cảm ơn bạn. ServiceBase.Run (servicesToRun); dòng đã được nhận xét trong quá trình này. –

+1

Đối với tôi, đó là bộ điều kiện gỡ lỗi để chạy mà không gọi 'ServiceBase.Run (serviceToRun); ' – absynce

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