none
win8 app中报0x0000005的错误,这是什么原因? RRS feed

  • 问题

  • 我的项目现在有个需求是这样:程序启动的时候需要根据不同的条件进入到不同的页面,这个条件根据是底层库返回回来的结果决定的。比如返回真,就进入A界面,返回假,就进入B界面。现在有个问题是,这个底层库是不知道什么时候回调回结果的。我现在的解决方法是,定义了个方法Method(在APP.cs里调用了这个方法),这个方法里包括自己定义了个timer定时器,并注册了事件,在这事件里,再判断回调函数的结果,在这个事件里通过Windows.UI.Xaml.Controls.Frame rootFram = new Windows.UI.Xaml.Controls.Frame();rootFram.Navigate(typeof(A界面));来导航。可跟踪代码的时候发现,在回调函数都还执行完,程序就回到了主线程,去执行app.cs里的 Window.Current.Activate();(而这个时候rootFrame.Content 是等于null),但在此运行到回调函数,执行完了,可以看到A界面,但是有些背景图却没显示出来,同时会报这个错误“发生了FatalExecutionEngineEeeo,其他信息: 运行时遇到了错误。此错误的地址为 0x6a06b26d,在线程 0x4f0 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。”请教下这个问题是什么原因造成的?我自己的猜想是因为:我都还没在定时器事件上设置上rootFrame.Content 是等于null, 程序就已返回到了app.cs中的Window.Current.Activate();把当前空的设置为了激活状态,等到我的回调函数执行后我再rootFram.Navigate(typeof(A界面));的时候,堆栈里都没有相应的内存空间。不知道是不是这个原因?还请高人指点,同时请高人指点该如何更正才能实现我的“根据不同条件,在启动的时候进入不同的界面”

    2013年5月15日 4:43

全部回复

  • 下面是相应的代码,高手请指点下!app.cs中

    if (rootFrame.Content == null)
                {
                    //当启动程序时进入到登录流程方法
                    //uloadMethod.LoadProcess();

                    // 当未还原导航堆栈时,导航到第一页,
                    // 并通过将所需信息作为导航参数传入来配置
                    // 参数

                    //程序的登录流程  --这里是自己定义的方法
                    UserLoadMethod userLoadMethod = new UserLoadMethod();
                    userLoadMethod.LoadProcess();

                    /*
                    if (!rootFrame.Navigate(typeof(Views.Main.MainPage), args.Arguments))
                    {
                        throw new Exception("Failed to create initial page");
                    }**/
                }
               // 确保当前窗口处于活动状态
              
               Window.Current.Activate();

    }

    这里是LoadProcess方法   public void LoadProcess()

    {if (CheckLastLoadIsRembPW())
                {
                    //last if rember pw -- use the pw  try to login
                    getDeviceIdToLoad = new GetDeviceIDToLoad(lastDevUserInfoList[0]);
                    getDeviceIdToLoad.GoToLoad();
                }

    }

    这里是GoToLoad方法    public void GoToLoad()        {
                timer.Interval = System.TimeSpan.FromSeconds(0.1);
                timer.Tick += timer_Tick;
                timer.Start(); 

    ResigterDevandUser("admin", "", _strDeviceSN, _strIP);

    }

    这里是调用底层库中的ResigterDevandUser方法 public void ResigterDevandUser(string strUserName, string PassWord, string DevId, string strIP)

    {

    TDataAccessManager tDataAccessManager = new TDataAccessManager();
      
                tDataAccessManager.InitCommunicationFrame();

                tDataAccessManager.OnAccessDataResultEvent += tDataAccessManager_OnAccessDataResultEvent;//这里就是回调结果

    }

    private void tDataAccessManager_OnAccessDataResultEvent()

    {//中间的代码省略 这里的isSuccesed 是全局变量,用来表示回调函数是否执行成功

    isSuccesed = true;

    }

    void timer_Tick(object sender, object e)
            {
                if (isSuccesed)

    {

     Windows.UI.Xaml.Controls.Frame rootFram = new Windows.UI.Xaml.Controls.Frame();

    rootFram.Navigate(typeof(APage));//这个定时器事件里就是进行设置哪个为第一个启动,现在是还没执行完这里就已执行完了APP.CS中的Window.Current.Activate();出现那些情况

     Windows.UI.Xaml.Window.Current.Content = rootFram;
     Windows.UI.Xaml.Window.Current.Activate();

    }求高手指点

    2013年5月15日 5:55
  • ?????
    2013年5月15日 6:41
  • 那如果要实现我那种根据不同条件来显示相应的启动页,应该怎么才能实现呢?
    2013年5月15日 6:51
  • 谢谢楼上的,我尝试了使用中间界面来过渡,但同样还是报这个错误,方便QQ或者SKYPE联系你,跟你交流下吗。我的QQ564463141,我的SKYPE的名称叫“Billy”
    2013年5月15日 8:31
  • 建议使用以下做法来简化流程:

    1 使用splash-extend做为第一个页面。

    2 在显示1的页面时,去判断真实的应该加载页面

    3 实际加载所需页面。

    2013年5月16日 5:56
  • 谢谢楼上的,目前我就是用1页面作为启动页,这个页面就是一个请等待,和一个ProgressRing。在这个页面加载的时候再去判断条件,根据条件来进入不同的页面。但很不稳定,经常性都是界面出不来,或者是有背景显示不出来。偶尔还报上面对错误。很是蛋疼啊!

    2013年5月16日 8:10