Band SDK除了codebehind之外,似乎在任何地方都不起作用

Band SDK除了codebehind之外,似乎在任何地方都不起作用,sdk,win-universal-app,microsoft-band,Sdk,Win Universal App,Microsoft Band,带有MVVMLight的通用应用程序 所以我开始想为什么所有的SDK示例都是从代码隐藏中完成的,而不是使用一个可靠的包装类 所以我想写一个可重用的包装器类。不走运。即使尝试将该包装器添加到ViewModel,仍然没有成功 从MainView.xaml.cs可以正常工作 IBandInfo[] pairedBands = BandClientManager.Instance.GetBandsAsync().Result; if (pairedBands.Length >

带有MVVMLight的通用应用程序

所以我开始想为什么所有的SDK示例都是从代码隐藏中完成的,而不是使用一个可靠的包装类

所以我想写一个可重用的包装器类。不走运。即使尝试将该包装器添加到ViewModel,仍然没有成功

从MainView.xaml.cs可以正常工作

IBandInfo[] pairedBands = BandClientManager.Instance.GetBandsAsync().Result;
            if (pairedBands.Length > 0)
            {
                using (IBandClient bandClient = await BandClientManager.Instance.ConnectAsync(pairedBands[0]))
                {

                }
            }
当我转向任何类型的OOP或视图模型时,ConnectAsync将永远不会返回或抛出异常。我试过20种不同的方法,SDK坏了吗?发生了什么事?没有消息,没有抛出,只是永远不会回来

如果我在后面插入代码,它工作正常,并在1/2秒内返回客户机

到目前为止,我已经为此花费了5-6个小时。我想为SDK创建一个坚实的包装类,这样我就可以从模型中调用简单的调用,并执行类似StartListener(MicrosoftBandSensor sensorToActivate)的操作

有什么建议吗

--请听菲尔的评论

我试图为客户机和bandinfo创建支持变量,这些变量将保存在VM使用的类中。我把我的类写为IDisposable,这样当我完成包装时,我就可以处理这两个类了。老实说,我可能用这句话说错了

 MicrosoftBand.MicrosoftBandClient = BandClientManager.Instance.ConnectAsync(pairedBands[0]).Result;
这就是我想要调用的,使其成为一个同步调用,因为我想要在构造函数中调用bandinfo和client,然后保留这两个,直到类被销毁,并在需要时调用变量

我的虚拟机有:

public BandInformation MicrosoftBand
        {
            get { return _microsoftBand; }
            set { Set(() => MicrosoftBand, ref _microsoftBand, value); }
        }
如果他们没有在构造函数中传递bandclient,我将使用:

 private async Task InitBand(IBandInfo bandInfo)
        {

            if (bandInfo == null)
            {
                var allBands = await BandClientManager.Instance.GetBandsAsync();
                if (allBands.Length > 0)
                {
                    bandInfo = allBands[0];
                }
            }
            var bandClient = await BandClientManager.Instance.ConnectAsync(bandInfo);
            MicrosoftBandInfo = bandInfo;
            MicrosoftBandClient = bandClient;

            if (MicrosoftBandClient == null)
            {
                AddErrorMessage("This sample app requires a Microsoft Band paired to your device.Also make sure that you have the latest firmware installed on your Band, as provided by the latest Microsoft Health app.");
            }

        }
与BandInfo一起使用似乎很好。我为客户机返回了一个看似可靠的工作对象,我得到的是“线程已退出”,其他什么都没有

注意:我曾经在try-catch-throwaway版本中使用过它,但也没有抛出任何异常

我想你可以像处理垃圾一样处理垃圾


我每次都可以重新启动BandClient,只是觉得我需要在某个时候分离事件,这意味着我必须控制BandClient。我可以一直保存到完成,每次都会根据需要添加和删除事件

很可能是您对的阻塞调用。VM构造函数中的结果是导致挂起的原因。IBandClientManager.ConnectAsync()可能隐式显示UI(一个Windows运行时对话框,要求用户确认是否要使用特定的蓝牙设备)。如果您在UI线程试图显示UI时阻止了它,那么您现在就陷入了死锁


调用Task.Result几乎从来都不是一个好主意,更不用说在构造函数中调用Task.Result了,因为您几乎不知道构造函数在哪个线程上执行。如果您使用的是异步API(如Band SDK),那么最好的办法就是保持交互也是异步的。相反,推迟调用ConnectAsync(),直到您真正需要,并从VM中的异步方法执行此操作。(无论如何,延迟连接是一个好主意,因为您希望尽可能减少连接到频带的时间以保持电池寿命。)然后尽早调用Dispose()以关闭蓝牙连接。

因此我去看了一些示例。最后,我登陆了MSDN站点上的GravityHeroUAP演示

我查看了他的代码和源代码: 他基本上是在做我想做的事

然而,我注意到一些奇怪的事情。在他的viewmodel中,一切都是静态的

  public static IBandInfo SelectedBand
        {
            get { return BandModel._selectedBand; }
            set { BandModel._selectedBand = value; }
        }

        private static IBandClient _bandClient;
        public static IBandClient BandClient
        {
            get { return _bandClient; }
            set
            {
                _bandClient = value;
            }
        }
我最终复制了这个模式(尽管在这个过程中我不得不扔掉我最喜欢的MVVM库,尽管我确信我可以找回它)

我的虚拟机中的常见模式:

  public string ExceptionOnStart {
            get { return _exceptionOnStart; }
            set { Set(() => ExceptionOnStart, ref _exceptionOnStart, value); }
       }
它现在好像在工作

这和我得到数据的方式太快了

await Windows.Storage.FileIO.AppendLinesAsync(dataFile, new List<string> { toWrite });
wait Windows.Storage.FileIO.AppendLinesAsync(数据文件,新列表{toWrite});
谢谢你的帮助,菲尔,这让我看到了正确的方向!
非常非常感谢。在这件事上花了很长时间。Mark

示例代码是从代码隐藏处编写的,目的是以尽可能最短、最简单的方式演示概念。M-V-VM(等等)虽然更适合于测试和重构,但往往会掩盖代码。您能否提供有关如何从视图模型(或其他基础结构)调用Band SDK的更多详细信息?在您的示例中,我注意到的一件事是在GetBandsAsync()上调用.Result,这是一个阻塞调用,而不是等待调用(就像您在ConnectAsync()中所做的那样)。回答很好。非常感谢。我用它作为IOTHUB到SA和PowerBI的演示,所以我甚至没有用“PC总是有电源”的方式来考虑它,并且阅读如果有蓝牙的话我可以打开的乐队,我认为所有的事件都被发送了,这取决于我的PC是否知道(打开和关闭监听器)。我将直接异步处理每一组调用,而不是等待客户机,看看是否可以修复它。但我不确定它是否做到了。我想我试过了,我会回来报告的。再次感谢你