Band SDK除了codebehind之外,似乎在任何地方都不起作用
带有MVVMLight的通用应用程序 所以我开始想为什么所有的SDK示例都是从代码隐藏中完成的,而不是使用一个可靠的包装类 所以我想写一个可重用的包装器类。不走运。即使尝试将该包装器添加到ViewModel,仍然没有成功 从MainView.xaml.cs可以正常工作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 >
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是否知道(打开和关闭监听器)。我将直接异步处理每一组调用,而不是等待客户机,看看是否可以修复它。但我不确定它是否做到了。我想我试过了,我会回来报告的。再次感谢你