Путаница над .NET 4 Async

Я использую пакет Microsoft.Bcl.Async nuget для использования Async/Await (моя цель - .NET 4, а не 4.5)

Я новичок в Async/Await. Моя проблема описана в следующем примере кода. Почему выделенная строка не называется?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AsyncTest
{
class Program
{
    static void Main(string[] args)
    {
        Run();

        Console.WriteLine("Got the value");

        Console.ReadKey();
    }

    public static async void Run()
    {
        Console.WriteLine("Testing Async...");

        var val = await AsyncMethod();

       //HIGHLIGHTED LINE. WHY IS THIS LINE NOT CALLED?
        Console.WriteLine("And the value is... {0}", val);
    }

    public static Task AsyncMethod()
    {
        long myVal = 1;

        for (long l = 0; l < 100000; l++)
        {
            myVal++;
            Console.WriteLine("l = {0}", l);
        }

        return new Task(() => myVal);
    }
}
}
3
Это не причина, но вам нужно поставить для цикла в задачу
добавлено автор gabba, источник

2 ответы

Линия:

Console.WriteLine("And the value is... {0}", val);

преобразуется (компилятором) в продолжение ; он будет вызываться (со значением и т. д.) только тогда, когда завершается задание, которое «ждет». Проблема заключается в следующем: вы создаете задачу, но вы не запустили : это никогда не будет завершено.

Если вы запустите задачу, которую вы создаете внизу, она в конечном итоге завершится. Кроме того, как правило, вы ставите «делать» работу внутри Task - не за ее пределами:

    public static Task AsyncMethod()
    {
        var task = new Task(() =>
        {
            long myVal = 1;

            for (long l = 0; l < 100000; l++)
            {
                myVal++;
                Console.WriteLine("l = {0}", l);
            }
            return myVal;
        });
        task.Start();
        return task;
    }

Также обратите внимание, что Получено значение печатается задолго до И значение ... - это потому, что продолжение происходит в рабочем потоке ; метод Run возвращает управление вызывающему абоненту ( Main ) в первом await .

5
добавлено
Любая причина, по которой вы не использовали Task.Factory.StartNew или Run ?
добавлено автор usr, источник
Спасибо, это имеет смысл!
добавлено автор rhughes, источник

Вы не должны называть его «AsyncMethod», потому что у него нет асинхронных элементов.

Метод использует задачу, которая будет запускаться в отдельном потоке из текущего потока.

1
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)