首页 新闻 会员 周边 捐助

winform异步加载页面的问题

0
悬赏园豆:20 [已解决问题] 解决于 2014-08-13 21:44

就是在做的项目中,在加载页面的时候需要和远程数据交互,一开始比较慢,会让用户感觉是“假死”一样的效果,现在是需要想做一个异步加载,一开始先显示滚动条,然后把加载好的页面显示出来,对应项目中的调用结构是这样的,在一个类中有若干个加载页面的方法,然后在主窗体中通过反射统一调用例如:

 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中的方法其实都是加载一个页面,所以想请教大家对应这应该如何实现异步加载?急!!!拜托个为大侠了

sysmenu的主页 sysmenu | 初学一级 | 园豆:71
提问于:2014-08-08 12:52
< >
分享
最佳答案
0

请用Backgroundworker

收获园豆:10
XiaoFaye | 老鸟四级 |园豆:3087 | 2014-08-08 13:07
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 | 园豆:71 (初学一级) | 2014-08-08 15:35

@sysmenu: 

window.Show();怎么会放在 backWork.RunWorkerAsync();后面??

XiaoFaye | 园豆:3087 (老鸟四级) | 2014-08-08 15:46

@XiaoFaye: 这个对backgroundwork没影响

sysmenu | 园豆:71 (初学一级) | 2014-08-08 16:11
其他回答(5)
0
收获园豆:5
wolfy | 园豆:2636 (老鸟四级) | 2014-08-08 13:23
0

这样太麻烦,你就正常把窗口显示出来,强制刷新一下。然后隔个半秒,开始执行BackgroundWorker,当然,执行前弹个进度条窗口或是把鼠标指针换成WAITCURSOR这样会友好一点。

收获园豆:5
爱编程的大叔 | 园豆:30844 (高人七级) | 2014-08-08 13:25
0

Backgroundworker b使用这个东西

贺臣 | 园豆:307 (菜鸟二级) | 2014-08-08 14:13
0

使用task.run看

519740105 | 园豆:5810 (大侠五级) | 2014-08-08 14:57
0

推荐BackgroundWorker,很方便进度条使用

jello chen | 园豆:7336 (大侠五级) | 2014-08-10 13:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册