Please review
От: SuhanovSergey  
Дата: 22.05.13 08:22
Оценка:
Изобрёл класс с 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();
}
Re: Please review
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 18.06.13 19:58
Оценка: 4 (1)
Здравствуйте, SuhanovSergey, Вы писали:

SS>Изобрёл класс с cемантикой ManualResetEvent, который можно ожидать не блокируя поток (await).


SS>Есть ли проблемы в коде? Есть ли уже готовый велосипед?


Готовый велосипед.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.