To może wydawać się trochę szalone, ale jest to podejście, które rozważam jako część większej biblioteki, jeśli mogę być dość pewna, że nie spowoduje dziwnego zachowania.Multipleksowanie asynchronizmu C# 5.0 w puli wątków - czy wątek jest bezpieczny?
Podejście:
Run asynchroniczny kod użytkownika z SynchronizationContext
że wysyła dostawcy do puli wątków. Kod użytkownik będzie wyglądać następująco:
async void DoSomething()
{
int someState = 2;
await DoSomethingAsync();
someState = 4;
await DoSomethingElseAsync();
// someState guaranteed to be 4?
}
nie jestem pewien, czy dostęp do someState
byłoby threadsafe. Podczas gdy kod byłby uruchamiany w jednym "wątku", tak, że operacje są w rzeczywistości całkowicie uporządkowane, może być nadal dzielony na wiele wątków pod maską. Jeśli moje zrozumienie jest poprawne, zamawianie powinno być bezpieczne na x86, a ponieważ zmienna nie jest udostępniona, nie będę musiał się martwić o optymalizacje kompilatora i tak dalej.
Co ważniejsze, jestem zaniepokojony, czy będzie to zagwarantowane w sposób bezpieczny dla wątków w modelach pamięci ECMA lub CLR.
Jestem prawie pewien, że będę musiał wstawić barierę pamięci przed wykonaniem kolejki pracy, ale nie jestem całkowicie pewny w moim rozumowaniu tutaj (lub że to podejście może być niemożliwe z całkowicie różnych powodów) .
Jest to zmienna lokalna. Jak nie może być bezpieczny dla wątków? IOW, co sprawia, że myślisz, że można go zmienić w innym wątku? (Chyba że podajesz odniesienie do niego gdzieś, co nie jest pokazane, np. "Ref" lub jako przechwycona zmienna). – leppie
Z tego co rozumiem, 'await' przekształca następujący kod w kontynuację, która jest wykonywana na bieżącym' SynchronizationContext', gdy kończy się podstawowe 'Zadanie'. Jeśli jest to wysyłanie do puli wątków, kontynuacja może działać w innym wątku. Nie uruchomi się * jednocześnie * w żaden sposób, ale nie jestem pewien, czy zmiany w 'jakimś stanie' będą gwarantowane, jeśli kontynuacja będzie wykonywana na innym wątku fizycznym. – ShZ
To jest świetne pytanie, o którym wielu ludzi nawet nie pyta. –