«Неизвестная ошибка времени выполнения» при использовании компонента времени выполнения Windows с приложением Javascript UWP - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь использовать Windows Runtime Component для обеспечения взаимодействия между моим приложением Javascript UWP и логикой C #, которую я написал. Если я устанавливаю минимальную версию для Обновления Fall Creator (сборка 16299, для использования библиотек .NET Standard 2.0), я получаю следующую ошибку при попытке вызвать простой метод:

Unhandled exception at line 3, column 1 in ms-appx://ed2ecf36-be42-4c35-af69-93ec1f21c283/js/main.js
0x80131040 - JavaScript runtime error: Unknown runtime error

Если я запускаю этот код с использованием Обновления Creator (15063) как минимум, то код работает нормально.

Я создал Github repo , содержащий образец решения, которое выдает ошибку для меня при локальном запуске.

Вот как выглядит main.js. Ошибка возникает при попытке запустить функцию getExample:

// Your code here!

var test = new RuntimeComponent1.Class1;

test.getExample().then(result => {
    console.log(result);
});

Вот как выглядит Class1.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using System.Threading.Tasks;
using Windows.Foundation;

namespace RuntimeComponent1
{
    public sealed class Class1
    {
        public IAsyncOperation<string> GetExample()
        {
            return AsyncInfo.Run(token => Task.Run(getExample));
        }

        private async Task<string> getExample()
        {
            return "It's working";
        }
    }
}

Я не могу придумать гораздо более простой тестовый пример, чем этот - у меня не установлены пакеты NuGet или что-то в этом роде. Я понятия не имею, что может быть причиной этого. У кого-нибудь еще есть идеи?

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

Это неправильный асинхронный метод:

private async Task<string> getExample()
{
    return "It's working";
}

Причина этого в том, что он должен был вернуть Task<string>, а не просто string.

Итак, вы должны изменить его на:

private async Task<string> getExample()
{
    return Task.FromResult("It's working");
}
0 голосов
/ 07 июля 2018

В этой функции нет ничего асинхронного, даже в упрощенном примере

private async Task<string> getExample()
{
    return "It's working";
}

Также, если указанная функция уже возвращает Task, тогда нет необходимости заключать ее в Task.Run здесь

return AsyncInfo.Run(token => Task.Run(getExample));

Измените код, следуя рекомендованному синтаксису

public sealed class Class1 {
    public IAsyncOperation<string> GetExampleAsync() {
        return AsyncInfo.Run(token => getExampleCore());
    }

    private Task<string> getExampleCore() {
        return Task.FromResult("It's working");
    }
}

Поскольку ожидать нечего, используйте Task.FromResult для возврата Task<string> из приватной функции getExampleCore().

Обратите внимание, что поскольку исходные функции возвращали незапущенные задачи, это приводит к тому, что InvalidOperationException вызывается методом AsyncInfo.Run<TResult>(Func<CancellationToken, Task<TResult>>) Method

Вы также можете рассмотреть возможность использования метода расширения AsAsyncOperation<TResult>, учитывая простое определение вызываемой функции.

public IAsyncOperation<string> GetExampleAsync() {
    return getExampleCore().AsAsyncOperation();
}

И вызывается в JavaScript

var test = new RuntimeComponent1.Class1;

var result = test.getExampleAsync().then(
    function(stringResult) {
        console.log(stringResult);
    });
...