我有一個C#程序,它有一個「代理程序」類。該程序創建了幾個代理程序,並且每個代理程序都有一個「run()」方法,該方法執行任務(即:Task.Factory.StartNew() ...)。
每個坐席進行一些計算,然後需要等待所有其他坐席完成他們的計算,然後才能進入下一階段(他的行爲將根據其他人的計算)。
爲了讓代理等待,我創建了一個CancellationTokenSource(名爲「tokenSource」),並且爲了提醒程序該代理將要入睡,我拋出了一個事件。因此,連續2個命令是:如何在不發生上下文切換的情況下在線程中執行2個連續的命令?
(1) OnWaitingForAgents(new EventArgs());
(2) tokenSource.Token.WaitHandle.WaitOne();
(該事件由「AgentManager」類,這是一個線程本身捕獲,並且所述第二命令使代理任務線程休眠直到的信號將被接收用於取消令牌)。
每次觸發上述事件時,AgentManager類都會捕獲該事件,並將+1添加到計數器。如果計數器的數量等於在程序中使用代理的數量,AgentManager(持有的引用,所有代理)喚醒每一個組成如下:
agent.TokenSource.Cancel();
現在我們達到我的問題:第一個命令由一個Agent異步執行,然後由於線程之間的上下文切換,AgentManager似乎捕獲該事件,並繼續喚醒所有代理。但是 - 目前的特工還沒有達到第二個命令呢! 因此,特工正在收到一個「喚醒」信號,然後他纔會進入睡眠狀態,這意味着他被卡住而沒有人將他叫醒! 有沒有辦法將兩個連續的方法「原子化」在一起,所以不會發生上下文切換,因此強制代理在AgentManager有機會喚醒他之前進入休眠狀態?
*基本*擔心在執行低級多線程編程時線程之間的上下文切換。 – 2011-04-12 12:14:14
對於「上下文切換」,我們是否在談論CPU切換到另一個線程上下文x毫秒以提供並行執行的感覺這一事實?你如何從.NET管理它? – vtortola 2011-04-12 15:46:30