[英]Asynchronous while loop update observable collection
我正在編寫的程序有問題。 我想要的是一個循環,該循環在程序運行時一直運行,時間跨度為30秒。 我希望此循環更新一個ObservableCollection,以便在有新消息時在窗口頂部顯示新聞。
我已經精簡了代碼,因此只有最重要的部分可供您使用。 如果該代碼行得通,我將在所觀察到的新聞集中看到一個新項目。 但是,這不是它的工作方式。 有了這段代碼,我只會得到第一個。
什么東西少了?
public MainWindow()
{
InitializeComponent();
ObservableCollection<News> list = new ObservableCollection<News>();
Task.Factory.StartNew(() => LoopFunction(list));
NewsListView.ItemsSource = list.OrderByDescending(a => a.Date);
}
public ObservableCollection<News> LoopFunction (ObservableCollection<News> list)
{
while (true)
{
list.Add(new News() { Date = "2016-12-12", From = "DIRECT:", Title = "This program is not working", Content = "We have to fix it." });
Thread.Sleep(30000);
}
}
public class News
{
public string Date { get; set; }
public string From { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
感謝您的所有評論。 這就是我的工作方式。
public MainWindow()
{
InitializeComponent();
ObservableCollection<News> list = new ObservableCollection<News>();
// Fetches news when the program initiates
FetchNews(list);
// Fetches news every 30 seconds
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(30);
timer.Tick += (s, args) => FetchNews(list);
timer.Start();
}
public void FetchNews (ObservableCollection<News> list)
{
list.Add(new News() { Date = "2016-12-12", From = "DIRECT:", Title = "This program is working", Content = "We have fixed it." });
NewsListView.ItemsSource = list.OrderByDescending(a => a.Date);
}
public class News
{
public string Date { get; set; }
public string From { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
只需使用DispatcherTimer即可完成異步操作
就像邁克說的那樣,當您使用OrderByDescending時,NewsListView不會收到有關“列表”集合更改的通知。
另外,如果您使用
NewsListView.ItemsSource = list;
在非UI線程中更新集合時,您仍然會獲得異常。 但是,是的,如果您使用的是.NET 4.5,則可以在非UI線程中更新集合,請按照以下步驟操作:
ObservableCollection<News> list = new ObservableCollection<News>();
BindingOperations.EnableCollectionSynchronization(list, listLock);
並且您還需要在類中的某個位置定義lock變量,
private object listLock = new object();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.