我有一个控制台应用程序,它使用类库来执行一些长时间运行的任务。这是一个.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看起来像这样(Job1Job2Job3实现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时,我需要能够创建一个新的子级ShellProgressBarShellProgressBar.Spawn)并将其显示为子级进度条,例如“并行作业”。

在这里,我正在寻求有关如何实现此目标的帮助。

注意:我不想在包含ShellProgressBar的类库中依赖MyService

任何帮助,不胜感激。

最佳答案

您的描述让我有些困惑,但是让我们看看我是否了解您的工作。因此,如果将所有这些都包装在一个类中,那么taskList1和taskList2可能是类变量。 (通过这种方式,可以更好地命名taskList1 / 2:说出parallelTask​​List等等。)然后您可以在CheckTaskStatus()类上编写一个新方法,并迭代两个类变量。这对您有帮助还是让我完全错过了您的问题?

关于c# - .net核心-将未知数量的IProgress <T>传递给类库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54718718/

10-09 03:35