2012-05-30 44 views
0

我們正在處理和上傳Windows服務(.net 4.0)中的大文件。過程和上載步驟可能需要幾分鐘才能完成。管理員可以直接在數據庫中將作業標記爲已取消,但要在內存隊列中清除,則需要重新啓動服務。目標是放棄這項工作,並在隊列中選擇下一份工作,而不必重新啓動服務。這是我想做的事:將線程/任務的異常或消息傳遞給主線程

在主入口點,啓動兩個任務:

Task processTask = Task.Factory.StartNew(ProcessJob); 

Task monitorTask = Task.Factory.StartNew(MonitorDB); 

ProcessJob會打電話像ProcessFile,UploadFile多長時間運行的步驟。我們正在檢查步驟之間的工作狀態,但工作可能會停留在這些長時間運行的步驟之一。

如果monitorTask檢測到數據庫中的作業狀態更改,它應該將其傳遞給主線程(通過異常或消息),以便主線程可以退出,從處理隊列中刪除自身,並允許隊列中的下一個作業啓動。無等待不能異常,但不能等待,因爲需要並行運行這些任務。 目前我們並不關心ProcessJob中的某些同步步驟可能仍在繼續,它最終可能會完成。我們會在代碼中處理。

到目前爲止,在我的所有應用程序中,我都使用Task.ContinueWith來獲得成功和失敗,但是從來沒有必須傳回主線程。

回答

1

你可以監視線索,並通過BlockingCollection<T>主線程之間的通信。

這是我寫的一個簡單例子。

BlockingCollection<string> queue = 
    new BlockingCollection<string>(); 

// monitor thread. 
Task.Factory.StartNew(() => 
{ 
    while (true) 
    { 
     Thread.Sleep(1000); 
     queue.Add("event occured."); 
    } 
}); 

// main thread. 
while (true) 
{ 
    // blocks when no messages are in queue. 
    string message = queue.Take(); 

    // kill process thread here. 
} 
+0

謝謝@jborg。它有幫助。順便說一句,我也意識到,我可以使用WaitAny在這兩個任務上實現類似的結果,然後檢查哪一個完成/故障。我有這兩個在測試應用程序。 – user1408552

1

爲此,您可以使用CancellationToken。如果您查看Task課程,那麼您可以通過CancellationToken來超負荷。存儲在您的服務,此令牌的引用,只是有你的上傳/處理程序定期檢查令牌已經被取消,像這樣:

if (yourToken.IsCancellationRequested) 
    break;