跨平台项目中的Windows 10电话日历

时间:2017-05-10 02:33:53

标签: calendar uwp xamarin.forms windows-10-mobile

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

var store = await Windows.ApplicationModel.Appointments.AppointmentManager.RequestStoreAsync(Windows.ApplicationModel.Appointments.AppointmentStoreAccessType.AppCalendarsReadWrite);

调用API后,特定于平台的项目会抛出此异常:

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

我想这与多线程和应用程序域有关!考虑到我已经给了应用程序的日历许可,任何人都遇到过类似的错误吗?

我的开发环境

  • Microsoft Visual Studio Community 2017

  • 版本15.1(26403.7)发布

  • VisualStudio.15.Release / 15.1.0 + 26403.7

  • Microsoft .NET Framework版本4.7.02046

  • 适用于通用Windows应用程序的Visual Studio工具15.0.26403.07

  • Xamarin 4.4.0.34(3f99c5a)

1 个答案:

答案 0 :(得分:2)

我检查了你的项目并重现了这个问题。您可以使用.Result关键字替换await来解决问题。

  

虽然异步编程相对简单,但要记住一些可以防止意外行为的细节。

     

异步方法需要在其正文中使用await关键字,否则永远不会产生!

     

这一点很重要。如果在异步方法的主体中没有使用await,则C#编译器将生成警告,但代码将编译并运行,就好像它是一种常规方法一样。请注意,这也是非常低效的,因为C#编译器为异步方法生成的状态机不会完成任何操作。

有关详细信息,请参阅Asynchronous programming

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

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