gpt4 book ai didi

c# - .net core - 将未知数量的 IProgress 传递给类库

转载 作者:行者123 更新时间:2023-11-30 18:12:54 26 4
gpt4 key购买 nike

我有一个控制台应用程序,它使用类库来执行一些长时间运行的任务。这是一个 .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();
}

此设置运行良好,我可以通过创建一个 ShellProgressBar 实例并使用一个 IProgress 来显示我的 HostedService 的进度条> 例如我必须更新它。

但是,我还需要运行 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) 并将它们显示为的子进度条让我们说“并行作业”。

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

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

非常感谢任何帮助。

最佳答案

我对你的描述有点困惑,但让我们看看我是否理解你的意思。因此,如果您将所有这些都包装在一个类中,那么 taskList1 和 taskList2 就可以是类变量。 (顺便说一下,taskList1/2 应该命名得更好:比如说 parallelTask​​List 等等。)然后你可以在 CheckTaskStatus() 类上编写一个新方法,并只遍历这两个类变量。这有帮助还是我完全错过了您的问题?

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com