new Function()
может использоваться для передачи тела функции в строку. И, следовательно, это можно использовать для создания динамических функций. Также передайте скрипт без выполнения скрипта.
var func = new Function("x", "y", "return x*y;");
function secondFunction(){
var result;
result = func(10,20);
console.log ( result );
}
secondFunction()
Вы столкнулись с стандартной ситуацией тупика, которую я описываю в своем блоге и в статье MSDN : метод async
пытается запланировать его продолжение на поток, который блокируется вызовом Result
.
В этом случае ваш SynchronizationContext
является тем, который используется NUnit для выполнения методов проверки async void
. Вместо этого я попытался бы использовать методы тестирования async Task
.
Вы блокируете пользовательский интерфейс, используя свойство Task.Result. В документации MSDN они ясно упомянули, что
"Свойство Result является свойством блокировки. Если вы попытаетесь получить к нему доступ до завершения своей задачи, в настоящий момент активен, блокируется до тех пор, пока задача не будет завершена, и значение будет доступно. В большинстве случаев вам нужно получить доступ к значению с помощью Await или ждать, а не напрямую обращаться к свойству. "
blockquote>Лучшее решение для этого сценария было бы удалить оба ждут & amp; асинхронный от методов & amp; используйте только задачу, в которой вы возвращаете результат. Это не помешает вашей последовательности выполнения.
Получение значения через метод async:
var result = Task.Run(() => asyncGetValue()).Result;
Синхронное вызов метода асинхронизации
Task.Run( () => asyncMethod()).Wait();
Не возникает проблем с блокировкой из-за использования Task.Run.
async void
и устранения гарантий с одинаковой резьбой, предоставленных SynchronizationContext
из тестируемой системы.
– Stephen Cleary
8 October 2015 в 10:21
.GetAwaiter().GetResult()
вместо .Result
, чтобы любой Exception
не был обернут.
– Camilo Terevinto
22 September 2017 в 10:30
Если вы не получаете никаких обратных вызовов или управляете зависанием, вызывая функцию Async службы / API. Вы должны настроить Context для возврата результата в том же вызванном контексте. Используйте TestAync (). ConfigureAwait (continueOnCapturedContext: false);
Вы столкнулись с этой проблемой только в веб-приложениях, но не в Static void main