2016-01-15 1 views
2

Я написал UWP-приложение, и все работает отлично (в режиме отладки и выпуска). Я упаковал свое приложение и установил его на планшет, на котором установлены окна 10 (я развиваюсь на настольном ПК Windows 10), по-прежнему нет проблем.
Но теперь я хочу запустить свое приложение в режиме назначенного доступа (режим киоска) на этом планшете, и вдруг из ниоткуда мои сообщения не появляются больше и появляется ошибка.
Потому что я работаю с шаблономMVVM я написал вспомогательный класс для показа MessageBoxes поэтому мне не нужно использовать Windows.UI в моих ViewModels:Не удается показать MessageBox во время работы приложения в режиме назначенного доступа в Windows 10

public class UserNotificationService : IUserNotificationService 
{ 
    public async Task ShowMessageDialogAsync(string message, string title = null) 
    { 
     MessageDialog messageDialog = title == null ? new MessageDialog(message) : new MessageDialog(message, title); 
     await ShowAsync(messageDialog); 
    } 

    // This method throws an error 
    private async Task ShowAsync(MessageDialog msgDialog) 
    { 
     // I've to do it like this because otherwise it won't work because I'm working on a different thread while calling this method 
     await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.N‌​ormal, async() => { 
     await msgDialog.ShowAsync(); 
     }); 
    } 
} 

Ошибка:

A COM call to an ASTA was blocked because the call chain originated in or passed through another ASTA. This call pattern is deadlock-prone and disallowed by apartment call control.

A COM call (IID: {638BB2DB-451D-4661-B099-414F34FFB9F1}, method index: 6) to an ASTA (thread 6992) was blocked because the call chain originated in or passed through another ASTA (thread 7188). This call pattern is deadlock-prone and disallowed by apartment call control. at: at Windows.ApplicationModel.Core.CoreApplicationView.get_CoreWindow()

Я не понимаю, что происходит во время работы с назначенным доступом в Windows 10. Как упоминалось выше, эта ошибка появляется только при запуске приложения в назначенном доступе. В любом другом случае все работает нормально (на настольном ПК и на планшете).

Так что мой вопрос:
Кто-нибудь испытывал такую ​​же проблему при разработке приложения для работы в режиме, назначенном доступа в Windows 10?
Или у кого-нибудь есть идея, как решить эту проблему?

+0

Вы пытались сначала проверить свойство HasThreadAccess диспетчера, чтобы не использовать RunAsync, когда код работает в потоке пользовательского интерфейса? –

ответ

4

Это может произойти сбой, поскольку вы используете диспетчер MainView, который не будет работать в приложении Windows 10 Assigned Access Mode.

Рекомендации для заключается в использовании

CoreApplication.GetCurrentView().Dispatcher 

вместо

CoreApplication.MainView.CoreWindow.Dispatcher 

От "Kiosk apps for assigned access: Best Practices"

Each view or window has its own dispatcher. In assigned access mode, you should not use the MainView dispatcher, instead you should use the CurrentView dispatcher.

0

Я рекомендую использовать для режима киоска является создание пользователя киоска с заменой оболочки и аутологин (https://github.com/VoidVolker/kiosk). Это дает больше контроля, и в этом случае вы свободны от каких-либо других проблем ОС, особенностей, дерьма и т. Д.