2014-09-02 95 views
-1

我有一個Windows服務執行兩個函數(函數1和函數2),但函數2需要5分鐘才能執行(數據庫中的審計用戶)。Windows服務中的多線程

當我啓動服務時,顯示超時消息:'錯誤:1053'。因爲function2運行速度慢,但如果我評論function2,服務運行良好。

我認爲MultiThread是一種解決方案,但我從來沒有與此合作過,如何在此服務中實現MultiThread?

我對啓動功能:

protected override void OnStart(string[] args) 
    { 
     // TODO: Add code here to start your service. 
     Function1(); 
     Function2(); 

     aTimer.Enabled = true; 
     eventLog1.WriteEntry("Starting"); 
    } 
+0

此問題似乎與服務無關。你只是問如何創建一個線程。這是一個相當簡單的任務,已經在廣泛的範圍內廣泛覆蓋。請使用websearch。 – 2014-09-02 14:05:37

+0

這兩個函數都訪問數據庫? – 2014-09-02 14:06:35

+0

@DavidHeffernan其實,如果不是服務,他不會有問題。這是一個問題,因爲他試圖在OnStart()中的服務主線程上完成所有工作。如果他在控制檯應用程序的main()中執行此操作,則不需要線程。 – Pete 2014-09-04 19:26:34

回答

0

您可以使用任務。這會更容易。如果你想aTimer.Enabled稱爲Task.Run內部還是外部的

Task.Run(() => 
{ 
    Function1(); 
    Function2(); 

    aTimer.Enabled = true; 
} 
eventLog1.WriteEntry("Starting"); 

我不知道:

如果Function2()取決於Function1(),那麼你可以這樣做。這取決於你使用它。

如果Function1()Function2()是獨立的,你可以同時執行它們:

Task.Run(()=> 
{ 
    Parallel.Invoke(()=> 
    { 
     Function1(); 
    }, 
    ()=> 
    { 
     Function2(); 
    } 
} 

這將在同一時間執行Function1()Function2()

+0

不一定,[Parallel.Invoke的文檔說](http://msdn.microsoft.com/en-us/library/dd992634(v = vs.110).aspx):*沒有關於訂單的保證其中的操作執行或**是否它們並行執行**。* – 2014-09-02 14:08:47

+0

在Windows中(顯然是海報的環境),它通常會同時執行,假設CPU可用。當然,它也假設有足夠的工作,一個功能在另一個功能開始之前不會完成。當然有些情況下他們不會同時執行,但在問題的背景下,這並不相關。 – Pete 2014-09-04 19:23:43

0
Thread temp_thread = new Thread(function); 
temp_thread.Start(); 
0

你可以嘗試以下方法:

Thread thread1 = new Thread(new ThreadStart(Funtion1)); 
Thread thread2 = new Thread(new ThreadStart(Function2)); 
thread1.Start(); 
thread2.Start(); 

我希望這將完成您的工作。

+2

您不想在OnStart方法中「加入」,該服務將因從方法返回時間過長而中止。 – 2014-09-02 13:19:49

+0

正如斯科特所說,在這種情況下調用'.Join'首先完全取消了線程的使用。 – 2014-09-02 14:01:31

+0

是編輯的版本是他需要的。加入將不會被使用。 – FreshDev 2014-09-02 14:46:13