Попробуйте:
В вашем интерфейсе измените Execute на:
public Task Execute();
В вашем классе C1:
//Add this line to conform to Interface
public event I.ExecutionCompleteHandler executionCompleted;
public async Task Execute()
{
// Create background worker and execute DoStuff
await DoStuff();
// You'll need to supply appropriate args here
BackgroundWorkerCompleted(this, args);
}
public void BackgroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
bool status = (bool)e.Result;
//Changed this line, assumed you needed the status from the line above
executionCompleted?.invoke(status);
}
Далее ваш MyManager должен выглядеть следующим образом :
public class MyManager
{
public async Task doStuff(int val)
{
var compObj = null
// compObj is now instantiated as new instance of C1, C2 or C3 depending on val
compObj = new C1();
// Subscribe to the 'executioncompleted' event in your new instance
compObj.executionCompleted += HandleExecutionComplete;
// Execute your code
await compObj.Execute();
// Unsubscribe from the event (cleaning up after yourself)
compObj.executionCompleted -= HandleExecutionComplete;
}
private void HandleExecutionComplete(bool status)
{
// Do stuff with status and exit gracefully
}
}
Ключевым моментом здесь является правильное назначение обработчика выполнения в вашем менеджере, а затем использование его для подписки на событие класса C1. Внутри класса C1 используйте Task для DoStuff и ждите его в Execute, который становится asyn c Task. Как только DoStuff
будет выполнено, запустится задача WorkerCompleted, запустит ваш обработчик и вы отключите go
Все это может быть несколько упрощено, но это выходит за рамки этого вопроса. Идея состоит в том, как будет работать поток управления, используя asyn c вызовы с await, чтобы убедиться, что ваша программа ожидает того, что ей нужно, а затем продолжает, и как вы подписываетесь на это событие извне.
Обязательно дождитесь звонка MyManager.doStuff также и снаружи, в противном случае ожидаемые результаты не будут получены вовремя.