Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何异步执行任何值委托?_C#_Asynchronous_Reactiveui - Fatal编程技术网

C# 如何异步执行任何值委托?

C# 如何异步执行任何值委托?,c#,asynchronous,reactiveui,C#,Asynchronous,Reactiveui,我让这段代码在每次其他属性更改时生成一个“计算”或“输出”属性。派生属性的生成是正确的,但由于CreateBlurImage的运行时间有点长,因此UI在运行时会冻结 获得相同最终结果的正确方法是什么,但是异步的 编辑这是@Shane提供的一些建议后我的代码的当前版本,但仍然有一个UI,在所有处理完成之前一直保持冻结状态。请注意,如果重要的话,有相当多的级联更新: public ColetaIsis Model { get; private set; } public strin

我让这段代码在每次其他属性更改时生成一个“计算”或“输出”属性。派生属性的生成是正确的,但由于
CreateBlurImage
的运行时间有点长,因此UI在运行时会冻结

获得相同最终结果的正确方法是什么,但是异步的

编辑这是@Shane提供的一些建议后我的代码的当前版本,但仍然有一个UI,在所有处理完成之前一直保持冻结状态。请注意,如果重要的话,有相当多的级联更新:

    public ColetaIsis Model { get; private set; }

    public string NomePaciente { get { return Model?.NomePaciente; } }
    public DateTime DataRealização { get { return Model.DataRealização; } }



    public BitmapSource Listras
    {
        get { return _listras; }
        set { this.RaiseAndSetIfChanged(ref _listras, value); }
    }
    BitmapSource _listras;


    public double[,] Grayscale { get { return _grayscale.Value; } }
    readonly ObservableAsPropertyHelper<double[,]> _grayscale;

    public double[,] BlurMenor { get { return _blurMenor.Value; } }
    readonly ObservableAsPropertyHelper<double[,]> _blurMenor;

    public double[,] BlurMaior { get { return _blurMaior.Value; } }
    readonly ObservableAsPropertyHelper<double[,]> _blurMaior;

    public double[,] Diferença { get { return _diferença.Value; } }
    readonly ObservableAsPropertyHelper<double[,]> _diferença;


    public BitmapSource FiltradaMenor { get { return _filtradaMenor?.Value; } }
    readonly ObservableAsPropertyHelper<BitmapSource> _filtradaMenor;

    public BitmapSource FiltradaMaior { get { return _filtradaMaior?.Value; } }
    readonly ObservableAsPropertyHelper<BitmapSource> _filtradaMaior;

    public BitmapSource ImagemDiferença { get { return _imagemDiferença?.Value; } }
    readonly ObservableAsPropertyHelper<BitmapSource> _imagemDiferença;


    public IEnumerable<ScatterPoint> Picos => _picos;
    IEnumerable<ScatterPoint> _picos;








    // CONSTRUTOR
    public ColetaIsisViewModel(ColetaIsis model) 
    {
        this.WhenAnyValue(x => x.Listras)
            .Where(item => item != null)
            .ObserveOn(RxApp.TaskpoolScheduler)
            .Select(im => GetArray.FromChannels(im, 0, 1))
            //.ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.Grayscale, out _grayscale, scheduler:RxApp.MainThreadScheduler);

        this.WhenAnyValue(x => x.Grayscale)
            .Where(item => item != null)
            .ObserveOn(RxApp.TaskpoolScheduler)
            .Select(ar => Gaussian.GaussianConvolution(ar, 1.5))
            //.ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.BlurMenor, out _blurMenor, scheduler: RxApp.MainThreadScheduler);

        this.WhenAnyValue(x => x.BlurMenor)
            .Where(item => item != null)
            .ObserveOn(RxApp.TaskpoolScheduler)
            .Select(ar => Gaussian.VerticalGaussianConvolution(ar, 5))
            //.ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.BlurMaior, out _blurMaior, scheduler: RxApp.MainThreadScheduler);

        this.WhenAnyValue(x => x.BlurMenor, x => x.BlurMaior)
            .Where(tuple => tuple.Item1 != null && tuple.Item2 != null)
            .ObserveOn(RxApp.TaskpoolScheduler)
            .Select(tuple => ArrayOperations.Diferença(tuple.Item1, tuple.Item2))
            //.ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.Diferença, out _diferença, scheduler: RxApp.MainThreadScheduler);



        this.WhenAnyValue(x => x.BlurMenor)
            .Where(item => item != null)
            .ObserveOn(RxApp.TaskpoolScheduler)
            .Select(ar => { ConversorImagem.Converter(ar, out BitmapSource im); return im; })
            //.ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.FiltradaMenor, out _filtradaMenor, scheduler: RxApp.MainThreadScheduler);

        this.WhenAnyValue(x => x.BlurMaior)
            .Where(item => item != null)
            .ObserveOn(RxApp.TaskpoolScheduler)
            .Select(ar => { ConversorImagem.Converter(ar, out BitmapSource im); return im; })
            //.ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.FiltradaMaior, out _filtradaMaior, scheduler: RxApp.MainThreadScheduler);

        this.WhenAnyValue(x => x.Diferença)
            .Where(item => item != null)
            .ObserveOn(RxApp.TaskpoolScheduler)
            .Select(ar => { ConversorImagem.Converter(ar, out BitmapSource im); return im; })
            //.ObserveOn(RxApp.MainThreadScheduler)
            .ToProperty(this, x => x.ImagemDiferença, out _imagemDiferença, scheduler: RxApp.MainThreadScheduler);


        Model = model;

        Listras = Model.Listras;  // fires up the initial cascading updates
    }
公共集合模型{get;private set;}
公共字符串NomePaciente{get{return Model?.NomePaciente;}
公共日期时间datarealizao{get{return Model.datarealizao;}
公共位图源列表
{
获取{return\u listras;}
设置{this.RaiseAndSetIfChanged(ref_listras,value);}
}
BitmapSource\u listras;
公共双[,]灰度{get{return{u Grayscale.Value;}}
只读ObservablePropertyHelper\u灰度;
public double[,]BlurMenor{get{return\u BlurMenor.Value;}}
只读ObservablesPropertyHelper\u blurMenor;
public double[,]BlurMaior{get{return\u BlurMaior.Value;}}
只读可观察属性帮助器;
public double[,]differença{get{return}differença.Value;}
只读ObservablePropertyHelper_diferença;
公共BitmapSource FiltradMenor{get{return\u FiltradMenor?Value;}}
只读ObservablePropertyHelper\u FiltradMenor;
公共BitmapSource FiltradaMaior{get{return\u FiltradaMaior?Value;}}
只读ObservablesPropertyHelper\u filtradaMaior;
公共位图源ImagemDiferença{get{return}ImagemDiferença?.Value;}
只读ObservablePropertyHelper_imagemDiferença;
公共IEnumerable Picos=>\u Picos;
IEnumerable_picos;
//承包商
公共学院视图模型(学院模型)
{
此.whenyValue(x=>x.Listras)
.Where(item=>item!=null)
.ObserveOn(RxApp.TaskpoolScheduler)
.Select(im=>GetArray.fromChannel(im,0,1))
//.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(这个,x=>x.Grayscale,out\u Grayscale,调度程序:RxApp.MainThreadScheduler);
此.whenyValue(x=>x.Grayscale)
.Where(item=>item!=null)
.ObserveOn(RxApp.TaskpoolScheduler)
.Select(ar=>Gaussian.GaussianConvolution(ar,1.5))
//.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(this,x=>x.BlurMenor,out\u BlurMenor,调度程序:RxApp.MainThreadScheduler);
此.whenyValue(x=>x.BlurMenor)
.Where(item=>item!=null)
.ObserveOn(RxApp.TaskpoolScheduler)
.Select(ar=>Gaussian.VerticalGaussianConvolution(ar,5))
//.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(this,x=>x.BlurMaior,out\u BlurMaior,调度程序:RxApp.MainThreadScheduler);
此.whenyValue(x=>x.BlurMenor,x=>x.BlurMaior)
.Where(tuple=>tuple.Item1!=null&&tuple.Item2!=null)
.ObserveOn(RxApp.TaskpoolScheduler)
.Select(tuple=>arrayooperations.Diferença(tuple.Item1,tuple.Item2))
//.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(this,x=>x.differença,outçu differença,调度程序:RxApp.MainThreadScheduler);
此.whenyValue(x=>x.BlurMenor)
.Where(item=>item!=null)
.ObserveOn(RxApp.TaskpoolScheduler)
.Select(ar=>{ConversorImagem.Converter(ar,out-BitmapSource-im);return-im;})
//.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(this,x=>x.filteradamenor,out\u filteradamenor,调度程序:RxApp.MainThreadScheduler);
此.WhenyValue(x=>x.BlurMaior)
.Where(item=>item!=null)
.ObserveOn(RxApp.TaskpoolScheduler)
.Select(ar=>{ConversorImagem.Converter(ar,out-BitmapSource-im);return-im;})
//.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(this,x=>x.filteradamaior,out\u filteradamaior,调度程序:RxApp.MainThreadScheduler);
此.whenyValue(x=>x.Diferença)
.Where(item=>item!=null)
.ObserveOn(RxApp.TaskpoolScheduler)
.Select(ar=>{ConversorImagem.Converter(ar,out-BitmapSource-im);return-im;})
//.ObserveOn(RxApp.MainThreadScheduler)
.ToProperty(这个,x=>x.ImagemDiferença,outçu ImagemDiferença,调度程序:RxApp.MainThreadScheduler);
模型=模型;
Listras=Model.Listras;//启动初始级联更新
}

这些方法中有哪一种有效?通过这种方式,CreateBlurImage部分在UIThread之外完成

public MyClass()
{
    this.WhenAnyValue(x => x.StripedImage)
        .ObserveOn(RxApp.TaskpoolScheduler)
        .Select(im => CreateBlurImage(im))
        .ObserveOn(RxApp.MainThreadScheduler)
        .ToProperty(this, x => x.Filtered, out _filtered);
}
或者,我非常确定在TopProperty上指定调度程序将与上面相同

public MyClass()
{
    this.WhenAnyValue(x => x.StripedImage)
        .ObserveOn(RxApp.TaskpoolScheduler)
        .Select(im => CreateBlurImage(im))
        .ToProperty(this, x => x.Filtered, out _filtered, scheduler:RxApp.MainThreadScheduler);
}

嗨,谢谢你的回答!我试过你的选择,但是没有用。在处理完成之前,UI一直被阻止。如果您中断了CreateBlurImage,您可以验证您是否打开或关闭UI线程吗?我按照您所说的做了,并打开了VS的
Threads
窗口,显示标记的线程是主线程。不过,我不知道这是否可取。我按照你说的做了,打开了VS的
Threads
窗口,出现标记的线程就是主线程。不过,我不知道这是否可取。如果
StripedImage
的更改速度超过
CreateBlurImage
的处理速度,那么您将使线程池饱和,整个系统将变慢。您可能希望尝试限制或采样以限制对CreateBlurImage的调用次数