2011-06-08 117 views
0

我在应用程序中使用的WinForms DataGridView的UI不会更新

1) Parallel.ForEach(linklist, x => DownloadAsync(x)); 
2) webClient.DownloadStringAsync(new Uri(link.Url)); 

class Link 
{ 
string url; 
string result; 
int progress; 
} 

其下载工作,并更新使用INotifyPropertyChanged的DataGridView的。

问题是,下载速度很快,datagridview更新第一行,然后UI不更新,但随后将鼠标光标逐一移动到datagridview行上,每行更新值。

我不明白我失去了什么。

请任何建议,谢谢你提前。

编辑:异步不阻止的GUI,所以我不使用后台线程。

+0

因此,您已将列表设置为DataGridView的DataSource,并且列表是ObservableCollection? – 2011-06-08 04:56:06

+0

BindingSource是DataSource,它获取LinkList – 2011-06-08 04:58:49

回答

3

虽然你不显示你的代码,但我认为你正在从backgroud线程更新UI元素,这是你永远不应该做的事情。如果您的目标是WinForms,则需要使用BackgroundWorkerControl.Invoke

BackgroundWorker Component Overview
How to: Implement a Form That Uses a Background Operation
How can I update my user interface from a thread that did not create it?

+0

异步不会阻止GUI,不我不使用backgroundworker,同一个线程 – 2011-06-08 05:00:13

+0

@Milan Aditya - 正确,异步不会阻止GUI,但是当异步回调时它会回调非回调-UI线程,对吧?所以你从非UI线程更新datagrid数据源。 BackgroundWorker保证回调会在UI线程中发生。 – 2011-06-08 05:02:42

+0

是的,你是正确的,但我正在做的是我已经设置dataGridView1.DataSource = _BindingSource;在form_load上,它会自动使用INotifyPropertyChanged更新 – 2011-06-08 05:14:20

-1

你的对象,约束,需要实现INotifyPropertyChanged