私のViewModel外のクラスからスレッドを処理する方法を理解しています。MVVMビューモデルでC#WPFスレッドを処理する方法
スレッドはTrack
クラスに由来します。ここでResponseEventHandler
コードがTrack
である:「コマンド」メソッドは、私のTrack
オブジェクト内から処理されると
public delegate void ResponseEventHandler(AbstractResponse response);
public event ResponseEventHandler OnResponseEvent;
、次のコードは、戻って私のViewModelにスレッドにメッセージを送信OnResponseEvent
を実行します:
if (OnResponseEvent != null)
{
OnResponseEvent(GetResponseFromCurrentBuffer());
}
GetResponseFromCurrentBuffer()
は、Track
内の事前定義タイプのメッセージタイプを返します。
私MainWindowViewModel
コンストラクタはTrack
からOnResponseEvent
のイベントハンドラを作成します。
public MainWindowViewModel()
{
Track _Track = new Track();
_Track.OnResponseEvent +=
new Track.ResponseEventHandler(UpdateTrackResponseWindow);
}
だから、アイデアは私がOnResponseEvent
スレッドからの新しいメッセージを持っているたびに、私はUpdateTrackResponseWindow()
メソッドを実行することです。このメソッドは、TrackResponseMessage
と呼ばObservableCollection<string>
リストプロパティに新しいメッセージ文字列を追加します:
private void UpdateTrackResponseWindow(AbstractResponse message)
{
TrackResponseMessage.Add(FormatMessageResponseToString(message));
}
FormatMessageResponseToString()
方法は、単にTrack
内のすべての事前定義されたメッセージタイプとメッセージを比較して、いくつかの気の利いた文字列フォーマットを行います。
主な問題は次のとおりです。TrackResponseMessage.Add()
を実行するとUIが消えます。実行可能ファイルは、まだバックグラウンドで実行し、タスクを終了する唯一の方法は、Visual Studio 2010
TrackResponseMessage
をシャットダウンするのは、私のViewModel内のパブリックプロパティです:
public ObservableCollection<String> TrackResponseMessage
{
get { return _trackResponseMessage; }
set
{
_trackResponseMessage = value;
RaisePropertyChanged("TrackResponseMessage");
}
}
がが必要ですTrack
オブジェクトから来たThread
を私のViewModelにマーシャリングするには?どのようなサンプルコードも非常に高く評価されます!
Yeeehaw !!それは素晴らしかった!リード、私はあなたにドーナツを借りています! .netスレッドのドキュメントを読む時間を節約できました。 TaskSchedulerを使用すると、ビューモデル内の他のクラスオブジェクトからのスレッドの読み込みが容易になります。 – EnLaCucha
@EnLaCucha:FYI - これは、SynchronizationContextがインストールされているスレッドでのみ機能します。これは、WPFのメインスレッド、WinFormsのメインスレッド、WCFサービスコールにも当てはまります。 –
.net 4.5では、BindingOperations.EnableCollectionSynchronizationを使用して別のスレッドからコレクションを編集できるようになりました。https://msdn.microsoft.com/en-us/library/hh140164(v=vs.110).aspx – Kelly