Подтвердить что ты не робот

Что я должен сделать, чтобы мои методы были доступны?

Как я могу запустить мои собственные асинхронные ожидаемые методы?

Я вижу, что писать асинхронный метод в некоторых случаях легко, как пирог:

private async Task TestGeo()
{
    Geolocator geo = new Geolocator();
    Geoposition pos = await geo.GetGeopositionAsync();
    double dLat = pos.Coordinate.Latitude;
    double dLong = pos.Coordinate.Latitude;
}

... но, к сожалению, также видно, что не любой метод может быть сделан асинхронно волей-неволей; для остроумия: это не работает:

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}

... он останавливает меня с ошибкой компиляции: "Не могу ждать int"; подсказка о времени разработки также говорит мне: "Тип" int "не является ожидаемым"

Я также пробовал это с теми же результатами:

    Task<int> i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);

Что я должен сделать, чтобы мои методы были доступны?

UPDATE

Как указал Linebacker и S. Cleary (любое отношение к этому коту, который раньше был на KNBR?), это работает:

int i = await Task.Run(() => TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5));

... то есть он компилируется, но он никогда не "движется".

Во время выполнения он сообщает мне, что я должен "ждать" CALL для TestAsyncAwait(), но если я это сделаю, он вообще не компилируется...

4b9b3361

Ответ 1

Вам нужно только вернуться в ожидании. Task/Task<TResult> является общим выбором; Task может быть создан с помощью Task.Run (для выполнения кода в фоновом потоке) или TaskCompletionSource<T> (для обертывания асинхронного события).

Для получения дополнительной информации прочитайте Асинхронный шаблон на основе задач.

Ответ 2

Ваш метод

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}

должно быть написано следующим образом

private async Task TestAsyncAwait()
{
    Task<int> t = new Task<int>(() =>
    {
        return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    });
    t.Start();
    await t;
}

Если вам нужно вернуть int, замените тип задачи:

private async Task<int> TestAsyncAwait()
{
    Task<int> t = new Task<int>(() =>
    {
        return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    });
    t.Start();
    return await t;
}

Дополнительное объяснение здесь.

Ответ 3

var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;

Ответ 4

Вам нужно либо использовать ожидаемый возврат, либо вернуть Task<Type of await call>

  • private async Task<Geoposition> TestGeo()
    {
        Geolocator geo = new Geolocator();
        return await geo.GetGeopositionAsync();
    }
    
  • private async Task<int> TestAsyncAwait()
    {
        return await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    }