none
Metro App Package Question: RRS feed

  • 问题

  • 版主你好:

    我们2种封装Appx的方式有截然不同的效果 :

    第一种情况:

      我们的工程在Visual Studio中Rebuild,Deployment后打开的程序运行正常;

    第二种情况:

      我们的工程通过Store -> Create App Package后的程序,安装后运行会出现程

    序被Hang住的情况(UI界面无响应);

      请问这2种情况的不同可能造成的原因是什么?

    2012年6月28日 2:26

答案

  • 千万不要在UI构造中去阻塞UI,你完全可以在OnNavigatedTo的时候,通过异步方式去create ChannelFactory,可以通过ThreadPool去异步开启一个Action去构建。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月28日 8:29
    版主

全部回复

  • 可能是你的应用在第二种情况下运行发生了一些异常导致hang了。最有可能的区别是,第一种是在本地开发目录发布运行的,所以如果你访问应用所安装的目录写文件是没有安全限制的。 而第二种则会安装到Windows App的安装目录,这个目录有很高的安全限制,不能往其中简单写入文件数据,会有异常抛出。

    不过上述只是我的猜测,如果需要更清楚地进行分析,则还需要你提供更多的信息,比如你的应用在什么步骤hang,是否有一些网络I/O操作等。 然后尝试通过记录日志的方式来记录应用运行的全过程,请将日志保存到Local Application Data下,http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh700361.aspx 同时请注册 Application.UnhandledException event,然后在其中捕获未处理的异常进行记录。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月28日 2:56
    版主
  • 版主你好,我程序中的关键问题我已经发现,我把关键部分拿出来做了个demo的最简单程序,请看以下代码

    metroClientWCF : metro端程序

    namespace metroClientWCF
    {
        public sealed partial class MainPage : Page
        {
            [ServiceContract]
            public interface IHelloWCFService
            {
                [OperationContract]
                string DesktopToMetro();
            }
            public IHelloWCFService Proxy;
            public ChannelFactory<IHelloWCFService> channelFactory;
            public DispatcherTimer timerDesktopToMetro = new DispatcherTimer();
    
            public MainPage()
            {
                this.InitializeComponent();
    
                this.button.Click += button_Click;
    
                this.timerDesktopToMetro.Interval = TimeSpan.FromSeconds(1);
                this.timerDesktopToMetro.Tick += new EventHandler<object>(DesktopToMetro);//Desktop->Metro
    
                this.channelFactory = new ChannelFactory<IHelloWCFService>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/HelloWCFService"));
                this.Proxy = this.channelFactory.CreateChannel();
    
                this.timerDesktopToMetro.Start();
            }
    
            void button_Click(object sender, RoutedEventArgs e)
            {
                //this.timerDesktopToMetro.Interval = TimeSpan.FromSeconds(1);
                //this.timerDesktopToMetro.Tick += new EventHandler<object>(DesktopToMetro);//Desktop->Metro
    
                //this.channelFactory = new ChannelFactory<IHelloWCFService>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/HelloWCFService"));
                //this.Proxy = this.channelFactory.CreateChannel();
    
                //this.timerDesktopToMetro.Start();
            }
    
            private void DesktopToMetro(object sender, object e)
            {
                this.timerDesktopToMetro.Stop();
    
                this.textBlock.Text = this.Proxy.DesktopToMetro();
    
                this.timerDesktopToMetro.Start();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
            }
        }
    }
    desktopServerWCF:desktop端程序

    namespace desktopServerWCF:
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                try
                {
                    ServiceHost host = new ServiceHost(typeof(ServiceProvider), new Uri("http://localhost:8000/HelloWCFService"));
                    host.AddServiceEndpoint(typeof(IHelloWCFService), new BasicHttpBinding(), "");
                    host.Open();
                }catch { }
            }
        }
    
            [ServiceContract]
            public interface IHelloWCFService
            {
                [OperationContract]
                string DesktopToMetro();
            }
    
            public class ServiceProvider : IHelloWCFService
            {
                public string DesktopToMetro()
                {
                    return "Hello,WCF!";
                }
            }
    }
    版主:请看我Metro端的程序,很简单,是一个WCF的基础程序,我用VisualStudio运行的时候很正常;

    但是当我按照步骤:Store->Create Package然后进行Windows App Certification Kit测试,然后结果会报fail,

    这个fail是关于performance的fail主要是关于在suspend时候会被挂住;

    原因我也已经分析了:发现是因为我在构造函数中初始化了

                this.timerDesktopToMetro.Interval = TimeSpan.FromSeconds(1);
                this.timerDesktopToMetro.Tick += new EventHandler<object>(DesktopToMetro);//Desktop->Metro

                this.channelFactory = new ChannelFactory<IHelloWCFService>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/HelloWCFService"));
                this.Proxy = this.channelFactory.CreateChannel();

                this.timerDesktopToMetro.Start();
    我把这段代码放入到Button Click时间处理函数中时候再Store->Create Package然后进行Windows App Certification Kit测试

    就会成功过的Pass;我想是因为failed就是因为构造函数中进行WCF的初始化和启动的行为;

    我们工程的目的是在程序开始时候就启动wcf然后让desktop程序和metro应用一直进行通信;

    请问版主你有什么好的建议,给我们能在程序刚开始运行时就就正常的运行WCF,并且在Store->Create Package然后进行Windows App Certification Kit测试

    时候不报失败;


    2012年6月28日 5:54
  • 千万不要在UI构造中去阻塞UI,你完全可以在OnNavigatedTo的时候,通过异步方式去create ChannelFactory,可以通过ThreadPool去异步开启一个Action去构建。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月28日 8:29
    版主