2011-10-09 47 views
0

好吧,我已經閱讀了關於多線程StackOverflow的其他一些帖子,但我沒有看到一個回答我的具體問題。C#進程監控線程飼料AJAX控制檯

我有一個MVC 3應用程序處理約5000條記錄從XML文檔到數據庫。我想讓視圖包含一個監視事務進度的AJAX控制檯(有多少次成功寫入,多少次失敗,潛在的重複標誌等)。我可以讓一個控制器實例運行進程,在進程生成時填充會話級別變量,並讓另一個實例僅由AJAX控制檯每隔1秒調用一次以獲取會話變量值?

有沒有更好的方法?多線程是我看到很多人提到的,但我沒有看到任何可以直接應用的解決方案。建議?

+0

也許一個靜態'class.variable'就是要走的路。 –

回答

1

您的建議是可行的,但需要一些思考。如果你有多個AJAX請求進來,那麼IIS將在多個線程上處理這些請求,所以你進入了多線程。這意味着您必須訪問線程安全的會話狀態。所以,你需要這樣的事情:

// put an instance of this class in the user's Session 
class Progress 
{ 
    public object Locker { get; private set; } 

    public Progress() 
    { 
     Locker = new Object(); 
    } 

    public int SuccessCount { get; set; } 
    public int FailureCount { get; set; } 
    public int DuplicateCount { get; set; } 
} 

// update the counts in the processing logic inside a lock 
Progress progress = Session[ ... ]; 
lock(progress.Locker) 
{ 
    progress.SuccessCount = ... 
    progress.FailureCount = ... 
    progress.DuplicateCount = ... 
} 

// read the counts in the progress handler also inside a lock on the same object 
Progress progress = Session[ ... ]; 
lock(progress.Locker) 
{ 
    retval.SuccessCount = progress.SuccessCount; 
    retval.FailureCount = progress.FailureCount; 
    retval.DuplicateCount = progress.DuplicateCount; 
} 
return retval; 

你也必須處理,其中處理線程完成,並在同一時間進度的要求正在處理移除會話對象的情況。此外,您可能必須在一個會話中處理多個處理線程(並因此處理Progress對象)。

有一點值得思考,但它是可行的。

+0

你認爲使用Static類會更好嗎?我在星期六晚上試了一下,似乎工作得很好,但我不確定這種異常情況。我要研究和測試你的方法。謝謝。 –