我正在尝试将设备日历集成到我的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)
答案 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();
}