我正在尝试响应式,但我不明白如何使一个简单的场景工作:我有一个在聊天室中侦听消息的方法。因此,它运行时间很长,并在找到消息时触发事件。
使用reactiveui,我想在窗口打开时启动这个长时间运行的方法,并在列表框中的屏幕上填充新消息。因为我使用的是 rx,所以我认为我需要一个长期运行方法的 IObseravble 版本,所以我做了一个这样的:
public static IObservable<Message> ObservableStream(int roomid, CancellationToken token)
{
return Observable.Create<Message>(
async (IObserver<Message> observer) =>
{
...
}
);
}
但是,我不知道如何将其与反应式联系起来。我需要一个ObservableAsPropertyHelper<List<Message>>
吗?目前,我只是在 a 中启动长时间运行的方法,Task.Factory.Startnew
然后在事件中手动添加到消息列表中,该列表绑定到前端列表框。这行得通,但它没有使用任何反应式用户界面,我觉得应该有一种反应式用户界面方法来做到这一点:
public class MainWindowViewModel : ReactiveObject
{
private ThreadSafeObservableCollection<Message> _Messages;
public ThreadSafeObservableCollection<Message> Messages
{
get { return _Messages; }
set {
this.RaiseAndSetIfChanged(x => x._Messages, value);
}
}
public MainWindowViewModel()
{
Client.NewMessage += (sender, args) => Messages.Add(args.Message);
var task = Task.Factory.StartNew(() => Client.GetStream(token), token, TaskCreationOptions.LongRunning, TaskScheduler.Current);
}
}
// IN the code-behind
this.OneWayBind(ViewModel, x => x.Messages, x => x.MessageList.ItemsSource);