Calendar 跨平台项目上的Windows 10手机日历

Calendar 跨平台项目上的Windows 10手机日历,calendar,uwp,xamarin.forms,windows-10-mobile,Calendar,Uwp,Xamarin.forms,Windows 10 Mobile,我正在尝试将设备日历集成到我的Xamarin表单应用程序中,但是,在Windows10Mobile中面临一些严重问题!在UWP的平台特定项目中,我调用以下本机API: var store = await Windows.ApplicationModel.Appointments.AppointmentManager.RequestStoreAsync(Windows.ApplicationModel.Appointments.AppointmentStoreAccessType.AppCalen

我正在尝试将设备日历集成到我的Xamarin表单应用程序中,但是,在Windows10Mobile中面临一些严重问题!在UWP的平台特定项目中,我调用以下本机API:

var store = await Windows.ApplicationModel.Appointments.AppointmentManager.RequestStoreAsync(Windows.ApplicationModel.Appointments.AppointmentStoreAccessType.AppCalendarsReadWrite);
调用API后,特定于平台的项目会引发以下异常:

消息筛选器指示应用程序正忙。 对ASTA(线程9840)的COM调用(IID:{638BB2DB-451D-4661-B099-414F34FFB9F1},方法索引:6)出现死锁并超时

我猜这与多线程和应用程序域有关!考虑到我已经授予该应用程序日历权限,有人曾经遇到过类似的错误吗

我的开发环境
  • 微软Visual Studio社区2017

  • 版本15.1(26403.7)发行版

  • VisualStudio.15.Release/15.1.0+26403.7

  • Microsoft.NET Framework版本4.7.02046

  • Visual Studio Tools for Universal Windows Apps 15.0.26403.07

  • Xamarin 4.4.0.34(3f99c5a)


我已经检查了您的项目并复制了该问题。您可以通过将
.Result
替换为
wait
关键字来解决此问题

尽管异步编程相对简单,但仍有一些细节需要记住,这些细节可以防止意外行为

异步方法的主体中需要有一个wait关键字,否则它们永远不会屈服

记住这一点很重要。如果在异步方法的主体中未使用wait,C#编译器将生成警告,但代码将像普通方法一样编译和运行。请注意,这也会非常低效,因为C#编译器为异步方法生成的状态机不会完成任何事情

有关更多详细信息,请参阅

不建议在属性的get方法中执行更多的逻辑代码。因此,您可以像下面的代码一样,在
OnAppearing
方法中获得
CalendarEvents

protected async override void OnAppearing()
{
    base.OnAppearing();
    var events = await DependencyService.Get<ICalendar>(DependencyFetchTarget.GlobalInstance).GetEventsAsync();
}


 
protected async override void OnAppearing()
{
base.OnAppearing();
var events=wait DependencyService.Get(DependencyFetchTarget.GlobalInstance).GetEventsAsync();
}

作为一个快速测试,您可以在UI线程和后台线程中调用API,看看其中一个是否有效。Device.BeginInvokeOnMainThread和Task.RunHi@AdamPedley在没有Device.BeginInvokeOnMainThread的情况下加载应用程序(新应用程序())后,我立即调用了平台特定项目中的Api,它工作正常!但是当我尝试使用Xamarin依赖项服务和Device.BeginInvokeOnMainThread做同样的事情时,api毫无例外地返回null!我不清楚发生了什么事!知道吗?我试着复制你的问题。但它在我的项目中运行得很好。可以展示更多关于你的界面实现的细节吗?嗨@NicoZhu MSFT,我刚刚快速创建了一个示例来重新处理这个问题。上传了样本。请参考UWP项目下的MainPage.xaml.cs和App.xaml.cs。一个方法使用Xamarin依赖项服务,而另一个方法调用主UI线程上的日历。