gpt4 book ai didi

c# - 与任务中的对象通信

转载 作者:行者123 更新时间:2023-11-30 16:53:54 25 4
gpt4 key购买 nike

我想知道在我的情况下如何或是否需要与在任务中运行的对象进行通信。

我有一组进程,它们是执行一些长时间运行的监视和计算的通用对象:

private IEnumerable<IService> _services;

因为它们基于一个公共(public)接口(interface),所以它们实现了一个方法“doSomeWork”。因此,为了争论起见,让我们调用该方法 DoWork。

我希望这些方法都在一个单独的任务空间中运行,而不是按顺序阻塞,所以我在类似范围级别上启动一个任务列表来运行这部分程序。

private List<Task> ProcessTask = new List<Task>();
private CancellationTokenSource tokenSource = new CancellationTokenSource();
private CancellationToken token;

private void startAll()
{
token = tokenSource.Token;
ProcessTask = _services.Select(service => Task.Factory.StartNew(
() => StartService(service),
token,
TaskCreationOptions.LongRunning,
TaskScheduler.Current)).ToList();
}

startservice 方法基本上启动监视并处理单个项目:

private void StartService(IService plugin)
{
...
...
plugin.DoWork();
...
...
}

服务也有“停止”和“继续”的方法,这引出了我的问题。在使用任务的核心,我最好尝试找到一种方法来影响服务,方法是使用事件或委托(delegate)来处理任务并暂停/停止任务,或者只是对外部 _services 集合中的项目调用这些方法?

例如:

_services.ForEach(item => item.Stop());

如果是前者,那么我如何从外部引发任务内部的事件,或者我应该监视外部标志?

最佳答案

您可以将 CancellationToken 用作一次性事件:

token.Register(() => item.Stop())

希望这将适用于您的特定“服务”API。请注意, token 可以在服务启动之前触发,也可以在您完成后触发。

关于c# - 与任务中的对象通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932720/

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