C# 异步线程加载数据 更新UI

关于多线程的处理,最近用的比较多,所以总结一下:
所谓异步加载数据,就是防止UI主线程加载大量数据(执行太多操作而死掉)。其实很简单,需要用到UI元素的在主线程,后台加载的数据都是与界面无关的。
加载的数据可以实时反应到UI界面上。其实就是使用了事件的做法
 下面是一个例子:
    public class ThreadHelper
    {
        private DirectoryInfo _directory;

        private string _searchText;

        private Thread _thread = null;

        public Action> Searching = null;

        public Action> SearchEnd = null;

        private List filelist = new List();

        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);  //重点,每搜找10个则返回数据
                }
                else if (item is DirectoryInfo)
                {
                    Search(item as DirectoryInfo);
                }
            }
        }
    }

    public class MainWindow
    {
        public MainWindow()
        {
            
        }
        List _list = new List();
        List oplist = new List();

        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());  //搜索完毕 ,终止所有还在等待执行的界面更新
            };
        }
    }
其中的方法可以根据需要做相应的修改,比如 不需要每次都使用_list总集合更新界面,可以通过临时变量 更新一点删一点。这样后面数据加载不会影响到前面的界面(比如有很多页)

你可能感兴趣的:(C#)