使用SemaphoreSlim锁定C#任务

时间:2019-06-13 17:27:24

标签: c# asynchronous locking task semaphore

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

我的问题是,如果我的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));
}

编辑

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

0 个答案:

没有答案