Member 11403304 Ответов: 1

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


В моем коде для GetCasesButton_Click есть ошибка, которую я не могу исправить. Мне нужна помощь.
Ошибка находится на await CandidateCaseController.Строка GetNextBAtchNumber ().

Там написано: Оператор 'await' может использоваться только в асинхронном методе. Рассмотреть вопрос о маркировке этот метод с модификатором async и меняется его тип возврата 'задания'.

Пожалуйста, помогите это исправить.

Что я уже пробовал:

Вот код для GetCasesButton_Click
protected void GetCasesButton_Click(object sender, EventArgs e)
 {
 #region Required Field Validation
    if (CaseNumbersTextBox.Text.Length < 1)
    {
       string myStringVariable = "Case number textbox cannot be empty.";
       ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + myStringVariable + "');", true);
     }
        if (RequestorDropDownList.SelectedItem.Value !=null)
        {
            ListItem requestorItem = new ListItem();
            requestorItem = (ListItem)RequestorDropDownList.SelectedItem;
        }
            
        if (ReasonDropDownList.SelectedItem.Value !=null)
        {
           ListItem reasonItem = new ListItem();
           reasonItem = (ListItem)ReasonDropDownList.SelectedItem;
        }
        #region Parse case number entries
        string userEnteredCaseNumbers = CaseNumbersTextBox.Text;
        userEnteredCaseNumbers = userEnteredCaseNumbers.Replace("\r", ",");
        userEnteredCaseNumbers = userEnteredCaseNumbers.Replace("\n", ",");
        
        while (userEnteredCaseNumbers.Contains(",,"))
            userEnteredCaseNumbers = userEnteredCaseNumbers.Replace(",,", ",");
            List<string> userEnteredCaseNumberList = new List<string>();
            userEnteredCaseNumberList = userEnteredCaseNumbers.Split(',').Where(x => x.Length > 0).ToList();
            userEnteredCaseNumberList = userEnteredCaseNumberList.Select(s => s.Trim()).ToList();
            #endregion
        try
        {
          #region Get Batch Number
          int newBatchNumber = await CandidateCaseController.GetNextBatchNumber();
          #endregion
          #region Insert entered case numbers in database
          foreach(string caseNumber in userEnteredCaseNumberList)
          {
             EditCandidateCaseModel newCandidate = new EditCandidateCaseModel();
             newCandidate.CaseNbr = caseNumber;
             //newCandidate.RequestorInfoID = requestorItem.Value;
             //newCandidate.RequestorInfoID = (ListItem)RequestorDropDownList.SelectedItem.Value;
             //newCandidate.ReasonID = requestorItem.Value;
             newCandidate.BatchNumber = newBatchNumber;
             newCandidate.EntryStaffUserName = this._loggedInUserName;
             await CandidateCaseController.PostCandidate(newCandidate);
          }

          #endregion
          }
            catch (Exception ex)
            {
               string errorMsg = string.Format("An error has occured in {0}. \nException:\n{1}", "GetCasesButton_Click()", ex.Message);
                MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + errorMsg + "');", true);
                return;
            }
}


Вот код aspx для кнопки
<asp:Button ID="GetCasesButton" runat="server" Text="Get Cases" Font-Size="8.25"
    BackColor="RoyalBlue" ForeColor="White" Height="24px" Width="74px"
    OnClick="GetCasesButton_Click" />

1 Ответов

Рейтинг:
7

Kris Lantz

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

protected void GetCasesButton_Click(object sender, EventArgs e)

к
protected async void GetCasesButton_Click(object sender, EventArgs e)


Если возврат должен был быть чем - то иным, чем недействительность, то дополнительное требование "
async Task<return type>
"будет включен в заголовок метода.


Richard Deeming

Прежде чем вы это сделаете, прочитайте:
Избегайте асинхронных методов void | Вы были взломаны[^]

Рекомендация Дэвида Фаулера заключается в том, чтобы создать отдельный async Task метод, назовите это из вашего void метод, и используйте "отбросить", чтобы избежать предупреждения компилятора.

protected void GetCasesButton_Click(object sender, EventArgs e)
{
    _ = GetCasesButtonClickAsync();
}

private async Task GetCasesButtonClickAsync()
{
    ...
}

AspNetCoreDiagnosticScenarios/AsyncGuidance.md at master · davidfowl/AspNetCoreDiagnosticScenarios · GitHub[^]

Таким образом, необработанные исключения в async метод поднимет Планировщиком.Событие UnobservedTaskException[^] вместо того, чтобы разбить процесс.

Kris Lantz

Об этом я как-то не подумал. Я ценю ваше добавление, добрый сэр.

Member 11403304

Большое тебе спасибо, Крис. Ваше решение действительно устранило проблему, и данные были вставлены в таблицу базы данных. Первый шаг мы уже выполнили. У меня есть и другие вопросы, которые я буду публиковать, продолжая разрабатывать свое веб-приложение. Спасибо еще раз. Оказалось, что решение было очень простым!