这个班级CancellationTokenSource是一次性的.快速浏览Reflector证明KernelEvent了(很可能)非托管资源的使用.由于CancellationTokenSource没有终结器,如果我们不处理它,GC将不会这样做.
另一方面,如果您查看MSDN文章" 托管线程中的取消"中列出的示例,则只有一个代码段处置该令牌.
在代码中处理它的正确方法是什么?
using如果您不等待它,则无法将启动并行任务的代码包装起来.只有在你不等的时候取消才有意义.ContinueWith通过Dispose电话添加任务,但这是要走的路吗?.ForAll(x => Console.Write(x))?因为它没有类似于Reset清理IsCancelRequested和Token字段的方法,所以我认为它不可重复使用,因此每次启动任务(或PLINQ查询)时都应该创建一个新任务.这是真的吗?如果是,我的问题是Dispose在这些CancellationTokenSource案例中处理的正确和建议的策略是什么?
新的 .NET Core“通用主机”似乎是实现运行多个并发任务的控制台应用程序的不错选择。与其显式地创建和运行任务,我想我可以使用 IHostedService(或 BackgroundService)将它们定义为服务。但是,通用主机正在同一线程上执行我所有所谓的“后台任务”。这是预期的行为吗?
public static async Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureHostConfiguration(...)
.ConfigureAppConfiguration(...)
.ConfigureServices((hostContext, services) =>
{
services.AddLogging();
services.AddHostedService<Service1>();
services.AddHostedService<Service2>();
services.AddHostedService<Service3>();
})
.ConfigureLogging(...)
.UseConsoleLifetime()
.Build();
await host.RunAsync();
}
Run Code Online (Sandbox Code Playgroud)
通用主机在同一线程上运行我的所有三个“后台”服务。Thread.CurrentThread.ManagedThreadId发现在主线程和每个“后台”服务的 StartAsync 或 ExecuteAsync 方法中等于 1。有没有办法确保服务在不同的线程上运行?