Konwertuję parser czatu dla gry, w którą gram, napisałem w C# winformach do wpf, głównie po to, aby uzyskać lepszą obsługę MVVM i wpf. Oto spływać jak mam swój projekt utworzeniaCzy korzystanie z Dispatchera w moim ViewModelu jest złe?
Zobacz: Dla Teraz tylko proste ListBox z ItemSource związanego z moich ViewModels collection obserwowalne czat
Modelu: mam stwardnienie znaki, które mogą być zalogowane za jednym razem, a każda postać ma klasę czatu. Klasa czatu uruchamia pracownika działającego w tle, który pobiera i rozpoczyna kolejną linię czatu z gry i odpala zdarzenie o nazwie IncomingChat w tym wierszu.
public event Action<Game.ChatLine> IncomingChat;
Używam tle Pracownik na ogień zdarzenie w moich backgroundworkers progresschaged imprezę, bo kiedy był przy użyciu timera Ciągle dostaję problem wątków. Najpierw poprawiłem to, zmieniając mój Timer na DispatchTimer, ale nie wydawało mi się, żebym miał DispatchTimer w moim modelu.
ViewModel: Ponieważ mam wiele znaków, tworzę wiele ChatViewModels. Przekazuję znak do konstruktora ChatViewModels i subskrybuję wydarzenie czatu. Tworzę ObservableColleciton do przechowywania linii czatu po odebraniu tego wydarzenia. Teraz otrzymuję problem z wątkiem na moim viewModel, gdy próbuję dodać linię, którą otrzymuję od mojego wydarzenia na czacie do mojego observablecollection.
mam wokół to poprzez moje ViewModels obsługi zdarzenia przychodzące rozmowy wyglądać tak
public ObservableCollection<Game.ChatLine) Chat {get; private set;}
void Chat_Incoming(Game.ChatLine line)
{
App.Current.Dispatcher.Invoke(new Action(delegate
{
Chat.Add(line)
}), null);
}
nie czuć prawo do mnie chociaż. Chociaż to działa, używanie Dispatchera w moim modelu widoku wydaje mi się nie na miejscu.
Używany jest kontekst synchronizacji. Ten wzorzec jest używany w całym tekście, więc Twój kod do gwintowania może być zapisany w sposób ogólny i nadal będzie dostępny bez względu na to, czy robisz wygrane, wcf, wpf, wf lub ASP.NET (domyślam się, że ostatni). – Will
@Will: OP używał WPF (w tekście), ale tak, to zadziała dla każdego technika, dlatego tak bardzo to lubię ... –
+1, nie wiedziałem, że TPL ma harmonogram który mógłby korzystać z Kontakty synchronizacji. Mój kod nadal bezpośrednio korzystał z wysyłania/wysyłania w SynchronizationContext. –