У меня есть делегат 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.
}
Хорошо, позвольте мне напечатать это в визуальной студии и отредактировать
Просто добавьте пару пробелов, где это необходимо, я сделаю это, но я очень ленивый :)
Вы не можете преобразовать асинхронный метод в синхронный с помощью await
. Вы можете await
вызвать ProcessCalibrationRun — т.е. await ProcessCalibrationRun(anObject);
. Вам придется заменить classA.ProcessCalibrationRun
делегата на Func<object, Task<RunEndStatus>>()
.
Хорошо, вместо внесения этого изменения, если я создам новый поток и сделаю это Thread.Sleep(10000) в этом новом потоке, он не заблокируется? Но в какой момент я должен сказать Thread.Join();
Подпись 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);
}
Это облегчает чтение кода, если он правильно отформатирован.