<Window x:Class="TestListUpdate.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<ListView Name="listView1">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Name" DisplayMemberBinding="{Binding Value.Name}" />
<GridViewColumn Width="140" Header="Creator" DisplayMemberBinding="{Binding Value.Creator}" />
<GridViewColumn Width="140" Header="Publisher" DisplayMemberBinding="{Binding Value.Publisher}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
namespace TestListUpdate
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
Dictionary<int, GameData> _gameData = null;
// This is a test, real data will be retrieved via a web service
List<GameData> _updates = null;
public Window1()
{
InitializeComponent();
// This is the original data bound to the ListView control
this._gameData = new Dictionary<int, GameData>();
this._gameData.Add(1, new GameData { Id = 1, Creator = "ABC", Name = "One", Publisher = "123" });
this._gameData.Add(2, new GameData { Id = 2, Creator = "DEF", Name = "Two", Publisher = "456" });
this._gameData.Add(3, new GameData { Id = 3, Creator = "GHI", Name = "Three", Publisher = "789" });
this._gameData.Add(4, new GameData { Id = 4, Creator = "JKL", Name = "Four", Publisher = "abc" });
this._gameData.Add(5, new GameData { Id = 5, Creator = "MNO", Name = "Five", Publisher = "def" });
// This is test data, some Ids are duplicates of the original data above
// other items represent new items
this._updates = new List<GameData>();
this._updates.Add(new GameData { Id = 2, Creator = "DDD", Name = "Two", Publisher = "123" });
this._updates.Add(new GameData { Id = 3, Creator = "TTT", Name = "Three", Publisher = "456" });
this._updates.Add(new GameData { Id = 5, Creator = "FFF", Name = "Five", Publisher = "789" });
this._updates.Add(new GameData { Id = 6, Creator = "XXX", Name = "Six", Publisher = "abc" });
this._updates.Add(new GameData { Id = 7, Creator = "VVV", Name = "Seven", Publisher = "def" });
System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 5);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
// Get a list of Ids from the new data
var ids = (from l in this._updates
select l.Id);
// Get a list of items that have matching Ids,
// this data will be updated
var updates = (from g in this._gameData
where ids.Contains(g.Value.Id)
select g);
// Update the current items
for (int i = 0; i < updates.Count(); ++i)
{
KeyValuePair<int, GameData> kvp = updates.ElementAt(i);
kvp.Value.Publisher = DateTime.Now.ToLongTimeString();
}
// This represents new items to add
this._gameData = this._gameData.Concat(
(from n in this._updates
where !this._gameData.ContainsKey(n.Id)
select n).ToDictionary(a => a.Id, a => a)
).ToDictionary(q => q.Key, q => q.Value);
// This is a simple trick to rebind the ListView control
this.listView1.ItemsSource = null;
this.listView1.ItemsSource = GameList;
}
// Databinding property
public Dictionary<int, GameData> GameList
{
get { return this._gameData; }
}
}
// Data class
public class GameData
{
public int Id { get; set; }
public string Name { get; set; }
public string Creator { get; set; }
public string Publisher { get; set; }
}
}
有趣的,你應該提到雙面打印。我使用WCF雙工操作通過IIS7和net.tcp實際的遊戲。我不確定發佈和訂閱會是大廳部分的最佳體系結構,因爲您需要做很多事情來處理負載平衡,故障轉移等雙工操作。另外,大廳在顯示時請求信息。當大廳窗口最小化時,我關閉了輪詢間隔。 – NickV 2012-01-10 19:45:57
你是對的,Pub/Sub是一個很大的開銷。事實上,在我目前正在開發的基於WCF的項目之一中,我剛剛決定採用循環輪詢方式:-) – Clemens 2012-01-10 19:52:13