.net - How to handle c# WPF thread in MVVM view model -
i having bear of time figuring out how handle thread class outside viewmodel.
the thread originates track
class. here responseeventhandler
code in track
:
public delegate void responseeventhandler(abstractresponse response); public event responseeventhandler onresponseevent;
when "command" method processed within track
object, following code runs onresponseevent
, sends message in thread viewmodel:
if (onresponseevent != null) { onresponseevent(getresponsefromcurrentbuffer()); }
getresponsefromcurrentbuffer()
merely returns message type pre-defined type within track
.
my mainwindowviewmodel
constructor creates event handler onresponseevent
track
:
public mainwindowviewmodel() { track _track = new track(); _track.onresponseevent += new track.responseeventhandler(updatetrackresponsewindow); }
so, idea every time have new message coming onresponseevent
thread, run updatetrackresponsewindow()
method. method append new message string observablecollection<string>
list property called trackresponsemessage
:
private void updatetrackresponsewindow(abstractresponse message) { trackresponsemessage.add(formatmessageresponsetostring(message)); }
the formatmessageresponsetostring()
method merely compares message pre-defined message types within track
, , nifty string formatting.
the main problem is: the ui disappears when trackresponsemessage.add()
run. executable still running in background, , way end task shut down visual studio 2010.
trackresponsemessage
public property within viewmodel:
public observablecollection<string> trackresponsemessage { { return _trackresponsemessage; } set { _trackresponsemessage = value; raisepropertychanged("trackresponsemessage"); } }
is there need me marshal thread
coming track
object viewmodel? example code appreciated!
is there need me marshall thread comming track.cs object viewmodel? example code appreciated!
yes. unfortunately, while inotifypropertychanged
handle events other threads, inotifycollectionchanged
not (ie: observablecollection<t>
). such, need marshal vm.
if vm being create view (view-first mvvm) or known created on ui thread, there's option using .net 4 tasks:
taskscheduler uischeduler; public mainwindowviewmodel() { uischeduler = taskscheduler.fromcurrentsynchronizationcontext(); track _track = new track(); _track.onresponseevent += new track.responseeventhandler(updatetrackresponsewindow); }
then, later, event handler can do:
private void updatetrackresponsewindow(abstractresponse message) { task.factory.startnew( () => trackresponsemessage.add(formatmessageresponsetostring(message)), cancellationtoken.none, taskcreationoptions.none, uischeduler); }
this has nice advantage of not pulling wpf or silverlight specific resources , types viewmodel class (ie: dispatcher
), while still providing of benefits. works, unchanged, in other routines thread affinity (ie: wcf service work).
Comments
Post a Comment