2013-04-12 59 views
5

Tôi có một dịch vụ cửa sổ và tôi đã viết mã để chạy các nhiệm vụ trong sự kiện OnStart():Cách chạy tác vụ khi dịch vụ windows khởi động?

protected override void OnStart(string[] args) 
     { 
      this.DoTask(); 
     } 

private void DoTask() 
     { 
      Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()); 

      try 
      { 
       Task.Wait(task1); 
      } 
      catch (Exception ex) 
      { 
       this.Log.Error("Failed running the task", ex); 
      }   
     } 

Các DoTask là một vòng lặp không bao giờ kết thúc. Nó sẽ dừng lại chỉ khi dịch vụ được dừng lại.

Nhưng khi tôi cố gắng để bắt đầu dịch vụ, nó chờ đợi một thời gian dài sau đó mang lại cho tôi những lỗi dưới đây:

Windows could not start the ... service on Local Computer. 
Error 1053: The service did not respond to the start or control request in a timely fashion. 

Làm thế nào để giải quyết nó?

Trả lời

7

Tại sao bạn đợi nhiệm vụ của mình hoàn thành?

Tôi nghĩ rằng Task.Wait đang chặn luồng hiện tại của bạn, sau đó bạn sẽ bị hết thời gian chờ khi bắt đầu dịch vụ.

EDIT: Bạn cần phải loại bỏ khối này:

try 
{ 
    Task.Wait(task1); 
} 
catch (Exception ex) 
{ 
    this.Log.Error("Failed running the task", ex); 
} 

Task.Wait thực sự đang cản trở chủ đề hiện tại của bạn. Theo MSDN:

Task.Wait Method

Waits for the Task to complete execution.

EDIT 2 Làm điều này thay vì

Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()).ContinueWith(t => 
{ 
    var aggException = t.Exception.Flatten(); 
    foreach(var ex in aggException.InnerExceptions) 
     this.Log.Error("Failed running the task", ex); 
}, 
TaskContinuationOptions.OnlyOnFaulted); 
+0

Việc chờ đợi không chờ đợi như vậy. Ý tôi là nó sẽ chỉ chụp bất kỳ ngoại lệ nào từ nhiệm vụ đó. –

+0

Việc chờ * là * "chờ đợi như vậy". Mã của bạn đang ngồi ở đó, không làm gì cả, chờ đợi nhiệm vụ đó hoàn thành. Và nó đang chờ đợi trên cùng một luồng được gọi là 'OnStart'. –

+0

không. nó được sử dụng để nắm bắt ngoại lệ. –

1

Trong vòng lặp, bạn cần phải kiểm tra xem trạng thái dịch vụ có "dừng" và thoát khỏi vòng lặp hay không. Bạn có 5 giây để làm điều đó trước khi hệ điều hành quyết định giết bạn.

1

Tôi đoán đây là, bởi vì bạn đang chờ đợi các OriginalFileProcessor.StartPolling() đến cuối, nhưng điều này không bao giờ xảy ra. Bạn nên di chuyển cá thể nhiệm vụ của bạn vào một thành viên riêng biệt và không đợi nó hoàn thành:

private Task m_task = null; 

private void DoTask() 
{ 
    try 
    { 
     m_task = Task.Factory.StartNew(() => this.StartPolling()); 
    } 
    catch 
    { 
     this.Log.Error("Unable to start task", ex); 
     throw; // Rethrow, so that the OS knows, there was something wrong. 
    }   
} 

private void StartPolling() 
{ 
    try 
    { 
     this.OriginalFileProcessor.StartPolling(); 
    } 
    catch (Exception ex) 
    { 
     this.Log.Error("Failed running the task", ex); 
    } 
} 
+0

bắt của bạn không bao giờ bắt được. Nó chỉ có thể bắt được khi bạn đợi nó. –

+0

@TheLight: Nó chỉ nên bắt ngoại lệ từ ['Task.Factory.StartNew'] (http://msdn.microsoft.com/en-us/library/dd321439.aspx), không phải từ' StartPolling'. Bạn đang bắt đầu một dịch vụ để chạy async, không phải đợi để nó kết thúc. Đã cập nhật câu trả lời. – Carsten

+0

Task.Factory.StartNew không trả lại ngoại lệ. Bạn có thể nắm bắt ngoại lệ khi chờ đợi một tác vụ. hoặc có cách nào khác không? –

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