gpt4 book ai didi

winrt-xaml - 节流事件和锁定方法

转载 作者:行者123 更新时间:2023-12-04 13:32:21 28 4
gpt4 key购买 nike

假设我有这样的事情:

<TextBox Text="{Binding Text, Mode=TwoWay}" />

像这样:
public class MyViewModel : INotifyPropertyChanged
{
public MyViewModel()
{
// run DoWork() when this.Text changes
Observable.FromEventPattern<PropertyChangedEventArgs>(this, "PropertyChanged")
.Where(x => x.EventArgs.PropertyName.Equals("Text"))
.Subscribe(async x => await DoWork());
}

private async Task DoWork()
{
await Task.Delay(this.Text.Length * 100);
}

public event PropertyChangedEventHandler PropertyChanged;

private string _Text = "Hello World";
public string Text
{
get { return _Text; }
set
{
_Text = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Text"));
}
}
}

在这种情况下,用户可能会很快输入。我需要:

当DoWork()已在运行时
  • DoWork()不得运行
  • 用户可以输入突击,一些更改,暂停,一些更改
  • 不需要每次更改
  • DoWork(),只需最后一次更改
  • 不需要调用DoWork()超过1秒
  • 如果突增> 1秒,
  • DoWork()不能等到最后一次更改
  • 闲置时不应调用
  • DoWork()
  • DoWork()的持续时间根据this的长度而变化。

    问题不是Rx是否可以做到这一点。我知道可以。什么是正确的语法?

  • 最佳答案

    尽管我有点同意James World的观点,但我认为如果我们仅使用一些可变状态,您可以做得更好。如果DoWork看起来像这样:

    AsyncSubject<Unit> doingWork;
    public IObservable<Unit> DoWork()
    {
    if (doingWork != null) return doingWork;

    doingWork = Observable.Start(() => {
    // XXX: Do work
    Thread.Sleep(1000);

    // We only kick off this 1sec timeout *after* we finish doing work
    Observable.Timer(TimeSpan.FromSeconds(1.0), DispatcherScheduler.Instance)
    .Subscribe(_ => doingWork = null);
    });

    return doingWork;
    }

    现在,DoWork可以自动反跳™,我们可以摆脱这种等待订阅的愚蠢行为。我们将 throttle 设置为250毫秒,设置为“快速但不是太快”。

    最初看来这违反了上面的要求#5,但是我们已经确保调用DoWork的任何人都太快了,只会得到上一次运行的结果-结果是DoWork将被调用很多次,但不一定要做任何事情。不过,这可以确保,如果我们不做工作,那么在用户停止键入后不会有1秒的延迟,就像 Throttle(1.seconds)这样
        Observable.FromEventPattern<PropertyChangedEventArgs>(this, "PropertyChanged")
    .Where(x => x.EventArgs.PropertyName.Equals("Text"))
    .Throttle(TimeSpan.FromMilliseconds(250), DispatcherScheduler.Instance)
    .SelectMany(_ => DoWork())
    .Catch<Unit, Exception>(ex => {
    Console.WriteLine("Oh Crap, DoWork failed: {0}", ex);
    return Observable.Empty<Unit>();
    })
    .Subscribe(_ => Console.WriteLine("Did work"));

    关于winrt-xaml - 节流事件和锁定方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21860133/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com