2011-04-11 70 views
0

我剛剛繼承了一個使用生產者 - 使用者模式的c#4.0 WinForms應用程序(基本上只是一個小儀表板)。我的消費者任務(字面上是System.Threading.Tasks.Task)正在處理隊列中的數據。當用戶想要關閉應用時,生產者(TCP套接字服務器)立即停止。但是,隊列可能不是空的,因此我需要給用戶立即退出的選項,或者消費者任務完成處理所有排隊數據後立即退出。如果用戶想要等待消費者任務完成,那麼UI自然需要保持響應。我遇到的問題是,因爲退出應用程序的代碼駐留在「退出」按鈕的單擊事件處理程序中,所以我可能需要等待消費者任務完成,而我處於單擊事件處理程序中。概括地說,事件處理程序包含這一(非常難看)代碼:.NET在等待任務完成時使應用程序保持活動狀態

// loop while there is still data in the queue 
    while (QueuedData.Count > 0) 
    { 
    Application.DoEvents(); // UI is semi-responsive but with a lot of CPU utilization) 
    } 

    // the queue is empty so now exit the application 

任何人都可以提出讓我沒有停留在緊密循環的事件處理程序內的UI實現該功能的另一種方式線?在此時啓動另一個線程/任務來處理此檢查,然後關閉該線程中的應用程序會有什麼意義嗎?非常感謝!

回答

0

您可以有一個退出任務,該退出任務在[退出按鈕] 的同一隊列中排隊 - 當隊列結束時,將調用Exit處理程序。

如果您願意,您可以在此期間更新UI以說'Exit pending ...'。

+0

感謝您的建議,用戶可以選擇等待強制關閉。我決定實施它。 – user685869 2011-04-13 12:57:44

0

處理關閉事件,取消它,將關閉事件添加到表單。

0

也使用這樣的循環可能會相當CPU密集,因爲你已經提到。爲什麼不使用Observer模式充分讓:

  • 用戶將監聽更新,並在BlockingCollection排隊它(或任何其它封閉的集合)

  • 另一個後臺線程將等待項目上述隊列並對其進行處理,因爲它沿着

亮起關機:

  • 你停止發佈到隊列中;

  • 你可以找到你在隊列中有多少個項目獲得,並通過GUI通知,所以如果需要

MSDN link on BlockingCollection

相關問題