Библиотека .netstandard и UniversalApiContract

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

это ошибка

«IAsyncAction» не содержит определения для «GetAwaiter», и не удалось найти метод расширения «GetAwaiter», принимающий первый аргумент типа «IAsyncAction».

это код, который мне нужно запустить

await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () => { OnUserChanged?.Invoke(user); });

удаление ключевого слова await приводит к рабочему коду, но я получаю это предупреждение

Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрите возможность применения оператора «ожидание» к результату вызова.

Как я могу это решить?


person frenk91    schedule 04.05.2017    source источник
comment
Не следует добавлять такую ​​ссылку, если она специфична для UWP.   -  person Lex Li    schedule 04.05.2017
comment
Ваша библиотека вообще не будет стандартной, если вы жестко закодируете тип WinRT, такой как CoreApplication. И async/await работает совсем по-другому в UWP-приложении, ничего особенно не понятного из ключевых слов. Поскольку он будет работать только в приложении UWP, рассмотрите возможность использования шаблона проекта Class Library (Universal Windows), чтобы двигаться вперед.   -  person Hans Passant    schedule 04.05.2017
comment
проблема в том, что мне нужно вызвать это событие, и это событие изменит объект в потоке пользовательского интерфейса. Если я не собираюсь использовать CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync, у меня есть доступ к перекрестному потоку   -  person frenk91    schedule 04.05.2017
comment
Как добавить ссылку на Windows.Foundation.UniversalApiContract? - Я не думаю, что это подходит для библиотеки netstandard.   -  person Stephen Cleary    schedule 04.05.2017


Ответы (1)


Убедитесь, что у вас есть using System; в верхней части файла кода. У него есть расширение, необходимое для превращения IAsyncAction в Task.

Если это не сработает, попробуйте этот оператор (просто чтобы убедиться, что код компилируется и запускается):

var a = CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () => { OnUserChanged?.Invoke(user); });

await System.WindowsRuntimeSystemExtensions.AsTask(a);

Если вышеуказанное не работает для вас, попробуйте временно обновиться до .Net Standard 1.4 (опять же, просто чтобы посмотреть, компилируется ли и запускается)

И если это не сработает, возможно, что-то не так со ссылками на библиотеки.

person Laith    schedule 04.05.2017
comment
Это первое, что я проверил, и там было использование - person frenk91; 04.05.2017
comment
Вы видите System.WindowsRuntimeSystemExtensions.GetAwaiter(..)? - person Laith; 04.05.2017
comment
Я получил только ошибку в описании «IAsyncAction» не содержит определения для «GetAwaiter», и не удалось найти метод расширения «GetAwaiter», принимающий первый аргумент типа «IAsyncAction». - person frenk91; 04.05.2017
comment
Обновлен мой ответ, чтобы помочь с некоторой отладкой. - person Laith; 04.05.2017
comment
WindowsRuntimeSystemExtensions не существует - person frenk91; 04.05.2017
comment
Хорошо, может быть, вы можете уточнить в своем вопросе, как вы добавили ссылки. - person Laith; 04.05.2017