Ниже у меня есть код, который добавляет Задачи в список всех запущенных в данный момент задач, которые я могу позже использовать.Я использую семафор, чтобы убедиться, что нет проблем с добавлением / удалением в список, - и я запускаю задачу только после того, как она была добавлена в список
Моя проблема в том, что если мой 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));
}
РЕДАКТИРОВАТЬ
Если у вас есть какие-либо другие предложения по более эффективной реализации этого пула задач - не стесняйтесь предлагать