Jaki byłby asynchroniczny (oczekiwany) odpowiednik AutoResetEvent?Awaitable AutoResetEvent
Jeśli w klasycznej synchronizacji wątku będziemy używać coś takiego:
AutoResetEvent signal = new AutoResetEvent(false);
void Thread1Proc()
{
//do some stuff
//..
//..
signal.WaitOne(); //wait for an outer thread to signal we are good to continue
//do some more stuff
//..
//..
}
void Thread2Proc()
{
//do some stuff
//..
//..
signal.Set(); //signal the other thread it's good to go
//do some more stuff
//..
//..
}
Miałem nadzieję, że w nowym asynchronicznym sposób robienia rzeczy, coś takiego przyjdzie się:
SomeAsyncAutoResetEvent asyncSignal = new SomeAsyncAutoResetEvent();
async void Task1Proc()
{
//do some stuff
//..
//..
await asyncSignal.WaitOne(); //wait for an outer thread to signal we are good to continue
//do some more stuff
//..
//..
}
async void Task2Proc()
{
//do some stuff
//..
//..
asyncSignal.Set(); //signal the other thread it's good to go
//do some more stuff
//..
//..
}
Widziałem inne niestandardowe rozwiązania, ale to, co udało mi się zdobyć, w pewnym momencie, wciąż wymaga zablokowania wątku. Nie chcę tego tylko ze względu na użycie nowej, oczekującej składni. Szukam prawdziwego wyczekiwanego mechanizmu sygnalizacji, który nie blokuje żadnego wątku.
Czy jest coś, czego mi brakuje w bibliotece zadań równoległych?
EDYCJA: Aby wyjaśnić: SomeAsyncAutoResetEvent jest całkowicie sklasyfikowaną nazwą klasy używaną jako symbol zastępczy w moim przykładzie.
Dla jednorazowy użytkowania, 'TaskCompletionSource' którego wynikiem jest ignorowany przez zadanie czeka. –
https://gist.github.com/AArnott/1084951 może? –
@MatthewWatson Widzę, że używa blokady, która zablokuje wątek z puli wątków. Miałem nadzieję na coś niezwiązanego z zablokowaną nicią. –