以下会用界面启动多个异步多任务,当任务较多时,会出现同时修改一个变量的情况吧?如果用锁,这种情形只能用SemaphoreSlim吗?求正确处理方案。
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
public interface ITaskManager
{
Task StartTaskAsync(int taskId);
void CancelTask(int taskId);
}
public class TaskManager : ITaskManager
{
private readonly ConcurrentDictionary<int, CancellationTokenSource> _cancellationTokenSources = new();
public async Task StartTaskAsync(int taskId)
{
var cancellationTokenSource = new CancellationTokenSource();
_cancellationTokenSources[taskId] = cancellationTokenSource;
var cancellationToken = cancellationTokenSource.Token;
await Task.Run(() =>
{
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine($"Task {taskId} is cancelled.");
break;
}
// 模拟工作
Console.WriteLine($"Task {taskId} is working...");
Thread.Sleep(1000); // 模拟工作负载
}
}, cancellationToken);
}
public void CancelTask(int taskId)
{
if (_cancellationTokenSources.TryRemove(taskId, out var cancellationTokenSource))
{
cancellationTokenSource.Cancel();
cancellationTokenSource.Dispose();
}
}
}
using Microsoft.AspNetCore.Mvc;
public class TaskController : Controller
{
private readonly ITaskManager _taskManager;
public TaskController(ITaskManager taskManager)
{
_taskManager = taskManager;
}
public IActionResult StartTask(int taskId)
{
_taskManager.StartTaskAsync(taskId);
return Ok($"Task {taskId} started.");
}
public IActionResult CancelTask(int taskId)
{
_taskManager.CancelTask(taskId);
return Ok($"Task {taskId} cancelled.");
}
}
using Microsoft.AspNetCore.Mvc;
public class TaskController : Controller
{
private readonly ITaskManager _taskManager;
public TaskController(ITaskManager taskManager)
{
_taskManager = taskManager;
}
public IActionResult StartTask(int taskId)
{
_taskManager.StartTaskAsync(taskId);
return Ok($"Task {taskId} started.");
}
public IActionResult CancelTask(int taskId)
{
_taskManager.CancelTask(taskId);
return Ok($"Task {taskId} cancelled.");
}
}