C# 异步线程加载数据 更新UI
2015-01-09 21:52
465 查看
关于多线程的处理,最近用的比较多,所以总结一下:
所谓异步加载数据,就是防止UI主线程加载大量数据(执行太多操作而死掉)。其实很简单,需要用到UI元素的在主线程,后台加载的数据都是与界面无关的。
<span style="font-family: Arial, Helvetica, sans-serif;">加载的数据可以实时反应到UI界面上。其实就是使用了事件的做法</span>
下面是一个例子:
public class ThreadHelper { private DirectoryInfo _directory; private string _searchText; private Thread _thread = null; public Action<List<string>> Searching = null; public Action<List<string>> SearchEnd = null; private List<string> filelist = new List<string>(); public ThreadHelper(string path,string mess) { //构造器,需要什么自己添,一般会传入数据 _directory = new DirectoryInfo(path); _searchText = mess; } public void StartThread() { _thread = new Thread(Start); } public void Start() { Search(_directory); } public void Stop() { if (_thread != null) _thread.Abort(); if (SearchEnd != null) SearchEnd(filelist); } public void Search(DirectoryInfo dir) { foreach (var item in dir.GetFileSystemInfos()) { if (item is FileInfo) { FileInfo file = item as FileInfo; if (!file.GetAccessControl().AreAccessRulesProtected) { if (file.Name.Contains(_searchText)) filelist.Add(file.FullName); } if (filelist.Count > 10 && Searching != null) Searching(filelist)<span style="color:#ff9900;">; //重点,每搜找10个则返回数据</span> } else if (item is DirectoryInfo) { Search(item as DirectoryInfo); } } } } public class MainWindow { public MainWindow() { } List<string> _list = new List<string>(); List<DispatcherOperation> oplist = new List<DispatcherOperation>(); private void button1_Click(object sender, RoutedEventArgs e) { SearchText = textBox1.Text; //界面的输入框 ThreadHelper helper = new ThreadHelper(@"F:\\", textBox1.Text); helper.Searching += (args) => { _list.AddRange(args); DispatcherOperation dp = this.Dispatcher.BeginInvoke((Action)delegate { //_list集合放到界面方法 //每次搜索结果都会重新将list集合表现到界面上 }, DispatcherPriority.Background); oplist.Add(dp); }; helper.SearchEnd += (args) => { //_list集合放到界面方法 oplist.ForEach(_ => _.Abort()); <span style="color:#ff6600;">//搜索完毕 ,终止所有还在等待执行的界面更新</span> }; } }其中的方法可以根据需要做相应的修改,比如 不需要每次都使用_list总集合更新界面,可以通过临时变量 更新一点删一点。这样后面数据加载不会影响到前面的界面(比如有很多页)
相关文章推荐
- C#利用委托跨线程更新UI数据
- C#利用委托跨线程更新UI数据
- C#利用委托跨线程更新UI数据
- 转:C# 通过委托更新UI(异步加载)
- C#利用委托跨线程更新UI数据
- C#利用委托跨线程更新UI数据
- C#利用委托跨线程更新UI数据
- c#利用委托进行异步跨线程加载到窗体数据
- Handler相关------方法,更新UI,异步,解决数据加载量等
- 后台线程处理数据,如何实时更新UI(datagridview)----多线程同步问题
- C# Winform 跨线程更新UI控件常用方法汇总
- C#线程更新UI的方法
- C# Winform 跨线程更新UI控件常用方法汇总
- Android-初识Handler-子线程异步更新UI
- C# 线程更新 UI
- ios开发,将子线程获取的数据实时更新到UI
- C# Winform 跨线程更新UI控件常用方法汇总
- WP7 HttpWebRequest跨线程异步更新界面UI
- C# 线程更新UI
- 简短总结一下C#里跨线程更新UI