首页 > 解决方案 > 使用 SemaphoreSlim 锁定 C# 任务

问题描述

下面我的代码将任务添加到我以后可以使用的所有当前正在运行的任务的列表中。我使用信号量来确保向列表添加/删除没有问题,并且我只在将任务添加到列表后才启动它

我的问题是,如果我的 SomeTask -- 包含 UI 操作,我不确定解决此问题的最佳方法是什么。

List<Task> tasks = new List<Task>();
SemaphoreSlim SemaphoreSlim = new SemaphoreSlim(1, 1);

async Task Lock(Action action)
{
  try
  {
    await SemaphoreSlim.WaitAsync();
    action();
  }
  finally
  {
    SemaphoreSlim.Release();
  }
}

public async Task SomeTask
{
   ///Some UI Operations occur here
}
public async void CreateTaskToPool()
{
  var task = new Task(() => SomeTask));

  await Lock(() => tasks.Add(task));
  task.Start();
  var control = await task;
  await Lock(() => tasks.Remove(task));
}

编辑

如果您有任何其他更好地实施此任务池的建议 - 请随时提出建议

标签: c#asynchronouslockingtasksemaphore

解决方案


推荐阅读