Честно говоря, я бы просто использовал событие в вашем прототипе задачи.
Не совсем понятно, что именно вы хотите, потому что код, который вы разместили, не соответствует именам, на которые вы ссылаетесь в тексте вашего вопроса ...Было бы полезно иметь весь код (например, функцию RunTasks, ваш прототип IProgress и т. Д.).
Тем не менее, событие существует специально для сигнализации вызывающего кода.Давайте вернемся к основам.Допустим, у вас есть библиотека MyLib с методом DoThings ().
Создайте новый класс, который наследуется от EventArgs и будет содержать отчеты о ходе выполнения вашей задачи ...
public class ProgressEventArgs : EventArgs
{
private int _taskId;
private int _percent;
private string _message;
public int TaskId => _taskId;
public int Percent => _percent;
public string Message => _message;
public ProgressEventArgs(int taskId, int percent, string message)
{
_taskId = taskId;
_percent = percent;
_message = message;
}
}
Затем в определении класса вашей библиотеки добавьте событие, например, так:
public event EventHandler<ProgressEventArgs> Progress;
И в вашем консольном приложении создайте обработчик для событий прогресса:
void ProgressHandler(object sender, ProgressEventArgs e)
{
// Do whatever you want with your progress report here, all your
// info is in the e variable
}
И подпишитесь на библиотеку классовevent:
var lib = new MyLib();
lib.Progress += ProgressHandler;
lib.DoThings();
Когда вы закончите, отмените подписку на событие:
lib.Progress -= ProgressHandler;
В вашей библиотеке классов теперь вы можете отправлять отчеты о прогрессе, вызывая событие в своем коде.Сначала создайте метод-заглушку для вызова события:
protected virtual void OnProgress(ProgressEventArgs e)
{
var handler = Progress;
if (handler != null)
{
handler(this, e);
}
}
А затем добавьте его в код своей задачи там, где вы хотите:
OnProgress(new ProgressEventArgs(2452343, 10, "Reindexing google..."));
Единственное, что нужно соблюдать осторожность, эторедко сообщайте о прогрессе, потому что каждый раз, когда ваше событие запускается, оно прерывает ваше консольное приложение, и вы действительно можете сильно его затормозить, если отправите 10 миллионов событий одновременно.Будьте логичны с этим.