Проверка выполняется из метода void без возможности возврата

#c# #async-await

#c# #асинхронный-ожидание

Вопрос:

Я пытаюсь разобраться в себе async , и await я пытался реализовать это в каком-то моем коде, что я сделал до сих пор:

Код:

         public async Task ExcecuteMacroCode(string _macroModeToUse, string[] _macroCode, string _site, Project _project)
        {
            try {
                string macroSelected = _macroModeToUse == "-[REG]" ? "-[REG]" : "-[LAP]";
                if (_macroModeToUse == macroSelected)
                {
                    foreach (string _macroCodeFile in _macroCode)
                    {
                        string[] code = _macroCodeFile.Split('|');

                        switch (code[0])
                        {
                            case "RJ_U":
                                string cleanUrl = code[1].Replace("{HOSTNAME}", _site);
                                browser.Load(cleanUrl);
                                panelBrowserMain.Controls.Add(browser);
                                browser.Dock = DockStyle.Fill;
                                browserMain.Text = cleanUrl;
                                browser.AddressChanged  = Browser_AddressChanged;
                                break;
                            case "RJ_I":
                                //await Task.Run(() => {
                                //    return browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(code[1], _project));
                                //});
                                browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(code[1], _project));
                                break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
            }
        }

        public async Task InitializeChromeBrowserAsync(ChromiumWebBrowser browser, string _macroModeToUse, string[] _macroCode, string _site, int _sitesCount, Project _project, Func<string, Tuple<string, string, string>> getUserPassEmail)
        {
            try
            {
                Task newTask = await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
                if (newTask.IsCompleted)
                {
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
            }
        }
 

То, как я его только что настроил, я получаю ошибку Cannot implicitly convert type 'void' to 'System.Threading.Tasks.Task' , насколько я понимаю, это потому method await ExcecuteMacroCode , что ничего не возвращает (что верно, мне действительно ничего не нужно возвращать)

Есть ли способ, которым я все еще могу убедиться, что задача выполнена, чтобы я мог использовать эту newTask.IsCompleted часть, я даже не уверен, что правильно настроил код, любая помощь будет оценена.

Комментарии:

1. Удалите Task newTask = и сохраните остальную часть строки. Вам не нужно проверять IsCompleted , если await возвращено, то это так. Если вы все еще хотите Task newTask = ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project); await newTask; ... это сделать, но это немного глупо.

Ответ №1:

Вам не нужно вручную проверять, завершена ли ожидаемая задача или нет. Это уже сделано оператором await .

Ошибка заключается в том, что этот вызов await _wellboreService.CreateWellboreSectionAsync(wellboreSection, CurrentUser) возвращается void , и вы пытаетесь назначить его Task newTask .

Когда вы await выполняете задачу, метод приостанавливается, и управление передается родительскому вызывающему до тех пор, пока задача не будет завершена, а затем она автоматически возобновляется. После оператора await вы знаете, что задача фактически завершена, потому что в противном случае вы бы не достигли этой строки при выполнении. Таким образом, нет необходимости вручную проверять IsCompleted свойство задачи.

Вы могли бы переписать свой код следующим образом:

 try
{
    await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
    this.Close();
}
catch (Exception ex)
{
    Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
}
 

Вы должны проверить официальную документацию.для получения дополнительных разъяснений и примеров, подобных этому:

 public async Task<int> GetUrlContentLengthAsync()
{
    var client = new HttpClient();

    Task<string> getStringTask =
        client.GetStringAsync("https://docs.microsoft.com/dotnet");

    DoIndependentWork();

    string contents = await getStringTask;

    return contents.Length;
}

void DoIndependentWork()
{
    Console.WriteLine("Working...");
}
 

Обратите пристальное внимание на оператор await . Он приостанавливает GetUrlContentLengthAsync :

  1. GetUrlContentLengthAsync не может продолжаться до getStringTask завершения.
  2. Между тем, управление возвращается вызывающей GetUrlContentLengthAsync стороне .
  3. Управление возобновляется здесь, когда getStringTask завершено.
  4. Затем await оператор извлекает результат строки из getStringTask .

Комментарии:

1. Большое вам спасибо, мне становится лучше с этим 🙂