我有一个控制台应用程序,它使用类库来执行一些长时间运行的任务。这是一个.net核心控制台应用程序,并使用.net核心通用主机。我还使用ShellProgressBar库显示一些进度条。
我的托管服务如下所示
internal class MyHostedService : IHostedService, IDisposable
{
private readonly ILogger _logger;
private readonly IMyService _myService;
private readonly IProgress<MyCustomProgress> _progress;
private readonly IApplicationLifetime _appLifetime;
private readonly ProgressBar _progressBar;
private readonly IProgressBarFactory _progressBarFactory;
public MyHostedService(
ILogger<MyHostedService> logger,
IMyService myService,
IProgressBarFactory progressBarFactory,
IApplicationLifetime appLifetime)
{
_logger = logger;
_myService = myService;
_appLifetime = appLifetime;
_progressBarFactory = progressBarFactory;
_progressBar = _progressBarFactory.GetProgressBar(); // this just returns an instance of ShellProgressBar
_progress = new Progress<MyCustomProgress>(progress =>
{
_progressBar.Tick(progress.Current);
});
}
public void Dispose()
{
_progressBar.Dispose();
}
public Task StartAsync(CancellationToken cancellationToken)
{
_myService.RunJobs(_progress);
_appLifetime.StopApplication();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
MyCustomProgress
看起来像这样public class MyCustomProgress
{
public int Current {get; set;}
public int Total {get; set;}
}
并且
MyService
看起来像这样(Job1
,Job2
,Job3
实现IJob
)public class MyService : IMyService
{
private void List<IJob> _jobsToRun;
public MyService()
{
_jobsToRun.Add(new Job1());
_jobsToRun.Add(new Job2());
_jobsToRun.Add(new Job3());
}
public void RunJobs(IProgress<MyCustomProgress> progress)
{
_jobsToRun.ForEach(job =>
{
job.Execute();
progress.Report(new MyCustomProgress { Current = _jobsToRun.IndexOf(job) + 1, Total = _jobsToRun.Count() });
});
}
}
而
IJob
是public interface IJob
{
void Execute();
}
此设置运行良好,并且我可以通过创建一个
HostedService
实例并使用一个ShellProgressBar
实例来显示我的IProgress
进度条,而我必须对其进行更新。但是,我还需要运行
IMyService
的另一种实现,如下所示public class MyService2 : IMyService
{
private void List<IJob> _sequentialJobsToRun;
private void List<IJob> _parallelJobsToRun;
public MyService()
{
_sequentialJobsToRun.Add(new Job1());
_sequentialJobsToRun.Add(new Job2());
_sequentialJobsToRun.Add(new Job3());
_parallelJobsToRun.Add(new Job4());
_parallelJobsToRun.Add(new Job5());
_parallelJobsToRun.Add(new Job6());
}
public void RunJobs(IProgress<MyCustomProgress> progress)
{
_sequentialJobsToRun.ForEach(job =>
{
job.Execute();
progress.Report(new MyCustomProgress { Current = _jobsToRun.IndexOf(job) + 1, Total = _jobsToRun.Count() });
});
Parallel.ForEach(_parallelJobsToRun, job =>
{
job.Execute();
// Report progress here
});
}
}
这是我一直在努力的那个。当执行
_parallelJobsToRun
时,我需要能够创建一个新的子级ShellProgressBar
(ShellProgressBar.Spawn
)并将其显示为子级进度条,例如“并行作业”。在这里,我正在寻求有关如何实现此目标的帮助。
注意:我不想在包含
ShellProgressBar
的类库中依赖MyService
任何帮助,不胜感激。
最佳答案
您的描述让我有些困惑,但是让我们看看我是否了解您的工作。因此,如果将所有这些都包装在一个类中,那么taskList1和taskList2可能是类变量。 (通过这种方式,可以更好地命名taskList1 / 2:说出parallelTaskList等等。)然后您可以在CheckTaskStatus()类上编写一个新方法,并迭代两个类变量。这对您有帮助还是让我完全错过了您的问题?
关于c# - .net核心-将未知数量的IProgress <T>传递给类库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54718718/