c#多线程网络请求,等待所有线程完成后更新UI
2018-01-15 19:02
411 查看
最近项目中需要循环进行网络请求拉取用户信息(每个用户信息都需要一次网络请求),拉取完成后需要通知界面更新UI。实现方法是使用C#提供的ManualResetEvent,相当于一个标记,在每个线程中插入这个标记。再启动一个线程循环监听这个标记,直到所有线程都执行完毕则更新UI。
public List<WxUserInfo> GetAllUerInfo(StringCollection userlist) { WxUserList = new List<WxUserInfo>(); //为每个线程创建一个ManualResetEvent对象 _ManualEvents = new ManualResetEvent[userList.Count]; int i = 0; foreach (string openid in userList) { _ManualEvents[i] = new ManualResetEvent(false); WXOBJ wxobj = new WXOBJ(_ManualEvents[i], openid); i++; //加入线程池 ThreadPool.QueueUserWorkItem(new WaitCallback(GetUserInfo), (object)wxobj); } //再启动一个线程监听其他线程执行状态 Thread t = new Thread(NotifyUI); t.Start(); return WxUserList; }
private void NotifyUI(object obj) { //等待所有线程释放_ManualEvents WaitHandle.WaitAll(_ManualEvents); //监听线程有时会抢先通知UI更新,所以这里让线程睡了1秒才通知更新 Thread.Sleep(1000); WxUserInfo[] allWxUser = WxUserList.ToArray(); //切换UI线程更新UI Action<DataGrid, List<WxUserInfo>> updateAction = new Action<DataGrid, List<WxUserInfo>>(UpdateListView); Information.Dispatcher.BeginInvoke(updateAction, Information, allWxUser.ToList()); var suto = new ManagerService.ManagerServiceClient().InsertWxUserInfoAsync(allWxUser); }
/// <summary> /// 创建一个对象封装manualResetEvent,和线程方法需要的参数 /// </summary> public class WXOBJ { public ManualResetEvent manualResetEvent { set; get; } 4000 public string openid { set; get; } public WXOBJ(ManualResetEvent manualResetEvent, string openid) { // TODO: Complete member initialization this.manualResetEvent = manualResetEvent; this.openid = openid; } }
相关文章推荐
- 网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据
- post请求网络数据,返回给主线程更新UI实例
- Java中等待提交线程池的所有线程执行完成
- httpUrlConnection连接网络的用法(用到了handle传递消息,在主线程中更新UI)
- [Java][Android] 多线程同步-主线程等待所有子线程完成案例
- NetworkComms网络程序开发笔记(二): 跨线程更新UI
- 主线程等待所有子线程完成后再执行
- 4.5.3 Async耗时操作必须由子线程完成,更新UI需要由主线程完成
- 主线程等待所有子线程完成后再执行
- 【安卓】使用Handler完成子线程更新ui
- [多线程] WaitHandle.WaitAll ManualResetEvent 等待所有线程完成
- Thread.join()方法实现main()方法等待所有子线程执行完成[base jdk8]
- 主线程等待所有子线程完成后再执行
- 主线程等待所有子线程完成后再执行
- 使用RxAndroid配合MVP模式实现异步网络请求,更新ui
- 更新UI操作需要在主线程完成
- 主线程等待所有子线程完成后再执行
- 非阻塞TCP套接字的要点 发表于 2015-04-22 | 分类于 网络编程 | 套接字的默认状态是阻塞的。如果一个套接字不能立即完成相应的调用,那么该线程就会被投入睡眠,等待相应的操
- 主线程等待所有子线程完成后再执行
- C#多线程 使用委托更新UI实例(WP7开发 其他线程中更新UI)(转载)