Изобрёл класс с cемантикой ManualResetEvent, который можно ожидать не блокируя поток (await).
Есть ли проблемы в коде? Есть ли уже готовый велосипед?
О SemaphoreSlim.WaitAsynс() знаю, но мне нужна семантика ManualResetEvent-а, когда можно отпустить сразу много ожидателей.
public class ManualResetTask
{
public ManualResetTask()
{
CreateNewTask();
}
public Task WaitAsync()
{
return task;
}
public void Set()
{
TaskCompletionSource<int> tmp = Interlocked.Exchange(ref taskCompletionSource, null);
if (tmp != null)
tmp.SetResult(1);
}
public void Reset()
{
CreateNewTask();
}
private void CreateNewTask()
{
var newTask = new TaskCompletionSource<int>();
Interlocked.Exchange(ref taskCompletionSource, newTask);
task = newTask.Task;
}
TaskCompletionSource<int> taskCompletionSource;
Task task;
}
Пример использования:
var somethingHappenedEvent = new ManualResetTask();
void async MyWaiter()
{
await somethingHappenedEvent.WaitAsync();
Console.Write("Something happened!");
}
void MakeSomethingHappen()
{
somethingHappenedEvent.Set();
}
Здравствуйте, SuhanovSergey, Вы писали:
SS>Изобрёл класс с cемантикой ManualResetEvent, который можно ожидать не блокируя поток (await).
SS>Есть ли проблемы в коде? Есть ли уже готовый велосипед?
Готовый велосипед.