C#新手:多核持续计算+双向API通信应用的技术选型及入门
最佳方案:基于ASP.NET Core Web API实现
优先选择ASP.NET Core Web API作为基础框架——它自带成熟的HTTP服务栈、依赖注入体系,能快速搭建API和双向通信能力,同时官方提供的Hosted Service完美适配长期运行的后台计算任务,不用从零造轮子。相比控制台集成API的方案,Web API模板已经帮你完成了大部分基础配置,更适合新手快速上手。
具体实现步骤
1. 创建ASP.NET Core Web API项目
- 用Visual Studio创建新项目,选择「ASP.NET Core Web API」模板,选.NET 8(长期支持版);或用CLI命令:
dotnet new webapi -n ComputeService
2. 集成不间断多核计算的后台任务
用ASP.NET Core官方推荐的Hosted Service实现长期运行的计算任务,它能和Web API生命周期深度集成,支持优雅停止,还能方便地和其他服务交互。
- 创建后台服务类:
public class ComputeBackgroundService : BackgroundService { private readonly IHubContext<ComputeHub> _hubContext; private readonly ComputeStateService _stateService; // 依赖注入获取SignalR上下文和状态服务 public ComputeBackgroundService(IHubContext<ComputeHub> hubContext, ComputeStateService stateService) { _hubContext = hubContext; _stateService = stateService; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { if (_stateService.IsRunning) { // 启动与CPU核心数匹配的并行任务,最大化利用多核资源 var computeTasks = Enumerable.Range(0, Environment.ProcessorCount) .Select(_ => Task.Run(DoHeavyComputation, stoppingToken)); await Task.WhenAll(computeTasks); } // 短暂延迟避免CPU空转(可按需调整或移除) await Task.Delay(100, stoppingToken); } } private async Task DoHeavyComputation() { // 这里编写你的计算逻辑,比如数值运算、数据处理等 var result = /* 计算得到的结果 */; // 通过SignalR把计算结果推送给客户端 await _hubContext.Clients.All.SendAsync("ComputeResultReceived", result); } } - 创建单例状态服务,用于控制计算启停:
public class ComputeStateService { public bool IsRunning { get; set; } = true; } - 在
Program.cs中注册服务:var builder = WebApplication.CreateBuilder(args); // 添加控制器和SignalR builder.Services.AddControllers(); builder.Services.AddSignalR(); // 注册单例状态服务和后台计算服务 builder.Services.AddSingleton<ComputeStateService>(); builder.Services.AddHostedService<ComputeBackgroundService>(); var app = builder.Build(); // 配置路由 app.MapControllers(); // 配置SignalR Hub路由 app.MapHub<ComputeHub>("/computeHub"); app.Run();
3. 实现双向通信(基于SignalR)
SignalR是ASP.NET Core官方的双向通信框架,能轻松实现服务器主动推送消息给客户端,同时支持客户端调用服务器方法。
- 创建SignalR Hub类:
public class ComputeHub : Hub { private readonly ComputeStateService _stateService; public ComputeHub(ComputeStateService stateService) { _stateService = stateService; } // 客户端调用此方法控制计算启停 public async Task ToggleCompute() { _stateService.IsRunning = !_stateService.IsRunning; // 通知所有客户端状态变更 await Clients.All.SendAsync("ComputeStateChanged", _stateService.IsRunning); } } - 客户端(如前端页面)可通过SignalR连接到
/computeHub,接收计算结果和状态变更,同时调用ToggleCompute方法控制计算。
4. 可选:添加RESTful API接口
如果需要通过REST接口控制计算或查询状态,可添加控制器:
[ApiController] [Route("api/compute")] public class ComputeController : ControllerBase { private readonly ComputeStateService _stateService; public ComputeController(ComputeStateService stateService) { _stateService = stateService; } [HttpGet("status")] public IActionResult GetStatus() { return Ok(new { IsRunning = _stateService.IsRunning }); } [HttpPost("toggle")] public IActionResult Toggle() { _stateService.IsRunning = !_stateService.IsRunning; return Ok(); } }
为什么不选控制台集成API?
控制台应用集成API本质是手动搭建ASP.NET Core托管环境,和Web API项目核心逻辑一致,但需要自己配置Kestrel服务器、中间件等,反而增加不必要的工作量。对新手来说,Web API模板已封装好所有基础配置,能让你把精力集中在计算逻辑和通信功能上。
内容的提问来源于stack exchange,提问作者JGeorgeJ
相关产品推荐
相关产品推荐

