我被困在試圖讓下面幾行工作的東西,這裏是一個完整的代碼示例,可以在Visual Studio中運行,演示我正在談論的場景。當我改變播放器的IsReady值時,這裏的一切都按預期工作,附加到事件的lambda被觸發,並且(如果)評估爲true。然而,Console.WriteLine從來沒有命中,因爲看起來ConcurrentBag中播放器的IsReady值沒有更新。與LINQ和對象引用相關的問題
class Program
{
public static ConcurrentBag<Player> Players { get; set; }
static void Main(string[] args)
{
Players = new ConcurrentBag<Player>();
Player player = new Player() { Id = "123" };
Players.Add(player);
player.IsReady.ValueChanged += (from, to) =>
{
if (to)
{
if (Players.All(p => p.IsReady.Value))
{
Console.WriteLine("It worked");
}
}
};
LookupPlayerById("123").IsReady.Value = true;
}
public static Player LookupPlayerById(string clientId)
{
var player = Players.FirstOrDefault(x => x.Id == clientId);
return player;
}
}
public class Player
{
public string Id { get; set; }
public MonitoredValue<bool> IsReady { get; set; }
public Player()
{
IsReady = new MonitoredValue<bool>(false);
}
}
public class MonitoredValue<T>
{
public delegate void ValueChangedHandler(T from, T to);
public event ValueChangedHandler ValueChanged;
private T m_Value;
public T Value
{
get { return m_Value; }
set
{
if (ValueChanged != null) // if invocation list is not empty, fire the event
{
ValueChanged(m_Value, value);
}
m_Value = value;
}
}
public MonitoredValue() { }
public MonitoredValue(T initialValue)
{
m_Value = initialValue;
}
}
'Player'是'class'或一個'struct'? –
玩家是一個類 –
然後你返回一個'參考'到Player對象。改變它的狀態將影響同一個對象,從'ConcurrentBag'被存儲的鏈接 –