Блокировка задач C # с использованием SemaphoreSlim - PullRequest
0 голосов
/ 13 июня 2019

Ниже у меня есть код, который добавляет Задачи в список всех запущенных в данный момент задач, которые я могу позже использовать.Я использую семафор, чтобы убедиться, что нет проблем с добавлением / удалением в список, - и я запускаю задачу только после того, как она была добавлена ​​в список

Моя проблема в том, что если мой SomeTask- содержит операции пользовательского интерфейса, я не уверен, что это лучший способ обойти эту проблему.

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));
}

РЕДАКТИРОВАТЬ

Если у вас есть какие-либо другие предложения по более эффективной реализации этого пула задач - не стесняйтесь предлагать

...