簡體   English   中英

異步while循環更新可觀察的集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM