Async, кажется, выполняет задачи до завершения, прежде чем попасть в тег Await - PullRequest
0 голосов
/ 26 апреля 2019

Я работаю над менеджером резервного копирования для некоторых Quest (устройств мониторинга критической инфраструктуры), когда я запускаю Код, кажется, что он выполняет мои задачи, добавляя их в список задач перед вызовом .WhenAll.затем при вызове .WhenAll я получаю исключения исключений и агрегировать исключения.Я использую telnet nuget, вы можете предположить, что telnet работает так же, как и сам по себе, и при этом синхронно

Я новичок в Async / Await в c #.Я попытался избавиться от части telnet и просто запустить HTTP и наоборот.Я удалил асинхронный метод (runBackupAsync) и запустил напрямую в асинхронный класс (BackupSingleBoxAsync) без изменений

(BackupSingleBoxAsync)

    private Quest QuestBox = new Quest();

    public BackupSingleBoxAsync(Quest q)
    {
        this.QuestBox.IP = q.IP;
        this.QuestBox.User = q.User;
        this.QuestBox.Password = q.Password;
        this.QuestBox.Type = q.Type;

    }

    public async Task<Quest> StartAsync()
    {
        Quest tempQuest = new Quest();
        while (QuestBox.User != null && QuestBox.Password != null)
        {
            if (QuestBox.Type.ToLower().Contains("mini"))
            {
                HttpDownload getRes = new HttpDownload(QuestBox);
                tempQuest = await getRes.Start();
            }
            else
            {
                Telnet getRes = new Telnet(QuestBox);
                tempQuest = await getRes.Start();
            }

        }
        this.QuestBox.Results = tempQuest.Results;

        return QuestBox;
    }

(контроллер резервного копирования)

        GetConfigs config = new GetConfigs(QuestMasterList);
        List<Quest> questAterDownload = config.GetAll().Result;

(GET CONFIGS)

    public List<Quest> QuestMasterList = new List<Quest>();

    public GetConfigs(List<Quest> list)
    {
        this.QuestMasterList.AddRange(list);
    }

    public async Task<List<Quest>> GetAll()
    {
        List<Task<Quest>> task_list = new List<Task<Quest>>();
        foreach (var quest in QuestMasterList)
        {
            task_list.Add(runBackupAsync(quest));
        }

        await Task.WhenAll(task_list);

        List<Quest> tempQuests = new List<Quest>();

        foreach (var tsk_rslt in task_list)
        {
            tempQuests.Add(tsk_rslt.Result);
        }

        return tempQuests;
    }

    private async Task<Quest> runBackupAsync(Quest quest)
    {
        BackupSingleBoxAsync backup = new BackupSingleBoxAsync(quest);
        Quest res = backup.StartAsync().Result;
        return res;
    }

(Quest)

    public string IP;
    public string User;
    public string Password;
    public string Type;
    public bool Success;
    public bool Diff;
    public List<string> Results = new List<string>();

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

...