#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
:
GetUrlContentLengthAsync
не может продолжаться доgetStringTask
завершения.- Между тем, управление возвращается вызывающей
GetUrlContentLengthAsync
стороне . - Управление возобновляется здесь, когда
getStringTask
завершено. - Затем
await
оператор извлекает результат строки изgetStringTask
.
Комментарии:
1. Большое вам спасибо, мне становится лучше с этим 🙂