Задача Async не возвращает значение, замерзая после компиляции. Wpf [дубликат]

new Function() может использоваться для передачи тела функции в строку. И, следовательно, это можно использовать для создания динамических функций. Также передайте скрипт без выполнения скрипта.

var func = new Function("x", "y", "return x*y;");
function secondFunction(){
   var result;
   result = func(10,20);
   console.log ( result );
}

secondFunction()
95
задан Johan Larsson 22 June 2013 в 22:45
поделиться

5 ответов

Вы столкнулись с стандартной ситуацией тупика, которую я описываю в своем блоге и в статье MSDN : метод async пытается запланировать его продолжение на поток, который блокируется вызовом Result.

В этом случае ваш SynchronizationContext является тем, который используется NUnit для выполнения методов проверки async void. Вместо этого я попытался бы использовать методы тестирования async Task.

68
ответ дан Stephen Cleary 21 August 2018 в 13:00
поделиться
  • 1
    переход на async Задача работала, теперь мне нужно прочитать содержимое ваших ссылок пару раз, сэр. – Johan Larsson 22 June 2013 в 10:13
  • 2
    Проголосовавший с тех пор, как не дает решения, только описание проблемы. См. Мой комментарий ниже для решения проблемы. – Herman Schoenfeld 8 October 2015 в 06:26
  • 3
    Фантастический ответ. Спасибо, Стивен. – Ahmed Karim 19 May 2016 в 15:47
  • 4
    Просто продолжайте читать о «перейдите в мой блог». и ваша проблема в этом, потому что это. Где решения !? – Mario Lopez 7 December 2016 в 04:29
  • 5
    @StephenCleary Я прочитал вашу книгу, и я честно пытаюсь найти ваши ответы полезными для меня. Я бы хотел, чтобы это можно было объяснить более просто и прямо – Joe Phillips 23 June 2017 в 18:17

Вы блокируете пользовательский интерфейс, используя свойство Task.Result. В документации MSDN они ясно упомянули, что

"Свойство Result является свойством блокировки. Если вы попытаетесь получить к нему доступ до завершения своей задачи, в настоящий момент активен, блокируется до тех пор, пока задача не будет завершена, и значение будет доступно. В большинстве случаев вам нужно получить доступ к значению с помощью Await или ждать, а не напрямую обращаться к свойству. "

Лучшее решение для этого сценария было бы удалить оба ждут & amp; асинхронный от методов & amp; используйте только задачу, в которой вы возвращаете результат. Это не помешает вашей последовательности выполнения.

6
ответ дан abatishchev 21 August 2018 в 13:00
поделиться

Получение значения через метод async:

var result = Task.Run(() => asyncGetValue()).Result;

Синхронное вызов метода асинхронизации

Task.Run( () => asyncMethod()).Wait();

Не возникает проблем с блокировкой из-за использования Task.Run.

161
ответ дан Herman Schoenfeld 21 August 2018 в 13:00
поделиться
  • 1
    -1 для поощрения использования модульных тестовых методов async void и устранения гарантий с одинаковой резьбой, предоставленных SynchronizationContext из тестируемой системы. – Stephen Cleary 8 October 2015 в 10:21
  • 2
    @StephenCleary: нет "enouraging & quot; асинхронной пустоты. Он просто использует действительную конструкцию c # для решения проблемы взаимоблокировки. Вышеприведенный фрагмент является незаменимым и простым решением проблемы OP. Stackoverflow - это решение проблем, а не подробное самореклама. – Herman Schoenfeld 16 October 2015 в 02:01
  • 3
    @StephenCleary: ваши статьи на самом деле не формулируют решение (по крайней мере, не ясно), и даже если у вас есть решение, вы будете использовать такие конструкции косвенно. Мое решение явно не использует контексты, так что? Дело в том, что мои работы и однострочный. Для решения проблемы не нужны две сообщения в блоге и тысячи слов. ПРИМЕЧАНИЕ. Я даже не использую async void , поэтому я действительно не знаю, о чем вы говорите. Вы видите & amp; async void & quot; где-нибудь в моем сжатом и правильном ответе? – Herman Schoenfeld 16 October 2015 в 06:05
  • 4
    @HermanSchoenfeld, если вы добавили why в how , я считаю, что ваш ответ принесет много пользы. – ironstone13 6 September 2017 в 19:39
  • 5
    Я знаю, что это немного поздно, но вы должны использовать .GetAwaiter().GetResult() вместо .Result, чтобы любой Exception не был обернут. – Camilo Terevinto 22 September 2017 в 10:30

Если вы не получаете никаких обратных вызовов или управляете зависанием, вызывая функцию Async службы / API. Вы должны настроить Context для возврата результата в том же вызванном контексте. Используйте TestAync (). ConfigureAwait (continueOnCapturedContext: false);

Вы столкнулись с этой проблемой только в веб-приложениях, но не в Static void main

2
ответ дан Mayank Pandit 21 August 2018 в 13:00
поделиться
13
ответ дан Vladimir 21 August 2018 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: