2

我目前在.net c#4.0中工作,並且遇到了一些我寫的代碼,這導致了一些令我頭痛的問題。System.Threading.ThreadAbortException在新線程中觸發

我正在使用System.Threading.Tasks.TaskFactory類與System.Threading.Tasks.TaskScheduler一起在我的控制檯應用程序中啓動一個新線程,其中線程的功能是檢查是否添加了一個項目排隊。當一個項目被添加到隊列中時,它會對其進行處理。

因此,隊列包含要發送的電子郵件,並且一旦將電子郵件添加到隊列中,電子郵件就會通過多個客戶端發送。發送到每個都是並行完成的。

我有其中以下異常在新的線程中發生一些時間此間歇性問題:

[System.Threading.ThreadAbortException] = {無法評估表達式,因爲代碼被優化或天然幀是在調用堆棧頂部}

調試時,我無法獲得任何進一步的信息,因爲堆棧中的所有屬性都有「無法評估表達式,因爲代碼已經優化或本地框架在調用之上棧「。

在互聯網尋找解決方案,我發現這是一個問題,發生在做response.redirect時,但我沒有在我的代碼中這樣做。如果我嘗試進行調試,則發生此錯誤的位置不存在一致性。以下是代碼,我用它來創建工廠,並開始新的線程:

this.taskFactory = new TaskFactory(TaskScheduler.Current); 
    this.taskFactory.StartNew(this.DequeueMessage, state, TaskCreationOptions.LongRunning); 

任何人任何指針,爲什麼我會收到此錯誤,併爲任何提示它如何能解決嗎?

+1

您是否正在Web應用程序中創建任務?如果是這樣,你可能看到AppDomain被回收。解決方案是將後臺線程移動到Windows服務中。 – 2012-07-17 18:00:48

+0

我在Visual Studio中運行的簡單集成測試中看到了這種行爲。當我在控制檯應用程序中運行相同的代碼時也會看到相同的行爲。 – amateur 2012-07-17 18:11:35

回答

3

您得到ThreadAbortException的唯一原因是因爲在線程上調用了Thread.Abort。如果你沒有手動這樣做,這可能會在客戶端應用程序終止時發生。當東西被回收時,它也會發生在託管環境中。如果您提供更多細節,可以提供更具體的答案。

+2

我通過用micrsoft visual studio測試框架編寫的集成測試調用此代碼。它剛剛明白,當我運行測試時,它在代碼完全執行之前完成,因此Thread.Abort完成。這可能嗎? – amateur 2012-07-17 19:05:26

+2

@amateur是的,這正是發生的事情。測試過程在後臺線程完成之前存在。在測試中,您需要「等待」,直到後退線程完成,然後退出測試。你可以用Task.Wait()來做到這一點()(StartNew返回一個任務對象) – 2012-07-17 19:15:48

+0

啊 - 不能相信它現在纔剛剛明白!這是你的迴應,讓我思考!當我在返回的Task對象上調用Wait方法時,這個任務似乎進入一個沒有任何處理的狀態,沒有處理,只是在那裏閒置。任何想法爲什麼這可能是這種情況? – amateur 2012-07-17 19:31:32