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

关于多线程的处理,最近用的比较多,所以总结一下:
所谓异步加载数据,就是防止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总集合更新界面,可以通过临时变量 更新一点删一点。这样后面数据加载不会影响到前面的界面(比如有很多页)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值