您的位置:首页 > 产品设计 > UI/UE

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总集合更新界面,可以通过临时变量 更新一点删一点。这样后面数据加载不会影响到前面的界面(比如有很多页)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息