就是在做的项目中,在加载页面的时候需要和远程数据交互,一开始比较慢,会让用户感觉是“假死”一样的效果,现在是需要想做一个异步加载,一开始先显示滚动条,然后把加载好的页面显示出来,对应项目中的调用结构是这样的,在一个类中有若干个加载页面的方法,然后在主窗体中通过反射统一调用例如:
1 public class test 2 { 3 public void Config() 4 { 5 WinGeneralConfig generalConfig = new WinGeneralConfig(); 6 generalConfig.TopLevel = false; 7 generalConfig.Dock = System.Windows.Forms.DockStyle.Fill; 8 generalConfig.FormBorderStyle = FormBorderStyle.None; 9 panel.Controls.Clear(); 10 panel.Controls.Add(generalConfig); 11 generalConfig.Show(); 12 13 } 14 public void Message() 15 { 16 WinMessage message = new WinMessage(); 17 message.TopLevel = false; 18 message.Dock = System.Windows.Forms.DockStyle.Fill; 19 message.FormBorderStyle = FormBorderStyle.None; 20 panel.Controls.Clear(); 21 panel.Controls.Add(message); 22 message.Show(); 23 } 24 } 25 26 public partial class WinMain : Form 27 { 28 /// <summary> 29 /// 通过反射实现统一方法的调用 30 /// </summary> 31 /// <param name="methodName">所调用的方法名</param> 32 private void GetMethodRealize(string methodName) 33 { 34 test winMethod = new test(); 35 Type type = winMethod.GetType(); 36 MethodInfo methodInfo = type.GetMethod(methodName); 37 methodInfo.Invoke(winMethod, null); 38 39 } 40 }
这里的 methodName就是对应test类中的方法名,由于执行每个test中的方法其实都是加载一个页面,所以想请教大家对应这应该如何实现异步加载?急!!!拜托个为大侠了
请用Backgroundworker
WinMethod winMethod = new WinMethod(pnlContent); Type type = winMethod.GetType(); MethodInfo methodInfo = type.GetMethod(methodName); WinProgressBar window = new WinProgressBar(); BackgroundWorker backWork = new BackgroundWorker(); backWork.DoWork += (s, a) => { Dispatcher.CurrentDispatcher.Invoke(new Action(() => { if (methodInfo != null) { methodInfo.Invoke(winMethod, null); } })); }; backWork.RunWorkerCompleted += (s, e1) => { window.Close(); }; backWork.RunWorkerAsync(); window.Show();
这个就是我使用backgroundworker的方法进行异步的调用,但是在滚动条结束后,需要显示的页面却没有填充的到主窗体的panel中
@sysmenu:
window.Show();怎么会放在 backWork.RunWorkerAsync();后面??
@XiaoFaye: 这个对backgroundwork没影响
这样太麻烦,你就正常把窗口显示出来,强制刷新一下。然后隔个半秒,开始执行BackgroundWorker,当然,执行前弹个进度条窗口或是把鼠标指针换成WAITCURSOR这样会友好一点。
Backgroundworker b使用这个东西
使用task.run看
推荐BackgroundWorker,很方便进度条使用