Не может дождаться делегата функции группы методов

У меня есть делегат func, который определяется следующим образом:

   public enum RunEndStatus
    {
        Success
    }
    public class classA
    {
        Func<object, RunEndStatus> ProcessCalibrationRun { get; set; }
    }

Теперь в другом классе, скажем, classB, я делаю что-то вроде этого,

public class ClassB
{
    public void DoSomething()
    {
        ClassA a = new ClassA();
        a.ProcessCalibrationRun = ProcessCalibrationRun;//This is just fine. It won't complain here.
    }
    public RunEndStatus ProcessCalibrationRun(object obj)
    {
        //Here I have some piece of code takes so much time. To replicate it,
        Thread.Sleep(10000);
    }
}

Когда откуда-то вызывается метод DoSomething, приложение блокируется на 10 минут. Поэтому я пытаюсь решить свою проблему следующим образом:

 public async Task<RunEndStatus> ProcessCalibrationRun(object obj)
    {
        await Task.Run(() => { Thread.Sleep(10000)});
        return RunEndStatus.Success;
    }

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

 public async void DoSomething()
    {
        ClassA a = new ClassA();
        a.ProcessCalibrationRun = await ProcessCalibrationRun; //Here it complains saying cannot await method group.
    }

Это облегчает чтение кода, если он правильно отформатирован.

TheGeneral 31.05.2019 02:16

Хорошо, позвольте мне напечатать это в визуальной студии и отредактировать

nikhil 31.05.2019 02:16

Просто добавьте пару пробелов, где это необходимо, я сделаю это, но я очень ленивый :)

TheGeneral 31.05.2019 02:17

Вы не можете преобразовать асинхронный метод в синхронный с помощью await. Вы можете await вызвать ProcessCalibrationRun — т.е. await ProcessCalibrationRun(anObject);. Вам придется заменить classA.ProcessCalibrationRun делегата на Func<object, Task<RunEndStatus>>().

shf301 31.05.2019 02:20

Хорошо, вместо внесения этого изменения, если я создам новый поток и сделаю это Thread.Sleep(10000) в этом новом потоке, он не заблокируется? Но в какой момент я должен сказать Thread.Join();

nikhil 31.05.2019 02:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
955
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подпись async возвращает Task, поэтому ваша Func также должна будет

public Func<object, Task<RunEndStatus>> ProcessCalibrationRun { get; set; }

Это означает, что вам не понадобится подпись async в вашем DoSomething, которой в любом случае не должно быть async void

public void DoSomething()
{
   vara = new ClassA();
   a.ProcessCalibrationRun = ProcessCalibrationRun;
}

Затем где-то еще (возможно, в ClassA) вы можете вызвать его.

public async Task DoSomethingElse()
{
   await ProcessCalibrationRun(somethignObject);
}

Другие вопросы по теме