Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 与WPF属性异步_C#_Wpf_Async Await - Fatal编程技术网

C# 与WPF属性异步

C# 与WPF属性异步,c#,wpf,async-await,C#,Wpf,Async Await,我有这样一个绑定属性: public string MyPath { get { return _mypath; } set { _mypath = value; NotifyPropertyChanged(() => MyPath); LoadSomeStuffFromMyPath(mypath) } } 我希望将LoadSomeStuffFromMyPath设置为异步,但我无法等待属性。有没有一个简单的方

我有这样一个绑定属性:

public string MyPath
{
    get { return _mypath; }
    set
    {
        _mypath = value;
        NotifyPropertyChanged(() => MyPath);
        LoadSomeStuffFromMyPath(mypath)
    }
}
我希望将LoadSomeStuffFromMyPath设置为异步,但我无法等待属性。有没有一个简单的方法可以做到这一点


编辑:不止一个人说过不要使用某个属性,所以我想说出来。我正在使用WPF,此属性绑定到UI。我必须使用一个属性。

因为您想强制操作在完成之前不继续,所以我建议创建一个方法来处理加载和显示进度

在加载UI时,您可以使用单独的属性禁用UI,这可以有效地“阻止”用户,直到操作完成:

public string MyPath
{
    get { return _mypath; }
    set
    {
        _myPath = value;
        NotifyPropertyChanged(() => MyPath);
        UpdateMyPathAsync();
    }
}

public async Task UpdateMyPathAsync()
{
    this.EnableUI = false; // Stop user from setting path again....
    await LoadSomeStuffFromMyPathAsync(MyPath); 
    this.EnableUI = true;
}

这允许您仍然像往常一样绑定WPF,但让您的UI反映操作正在运行(异步)并显示进度等。

也许您应该将这种逻辑移到方法中。您违反了使用属性的指导原则:

该操作比字段集慢几个数量级。 如果您甚至考虑提供 操作以避免阻塞线程,很可能 运营成本太高,不可能成为一项财产。特别是业务 访问网络或文件系统的用户 初始化)最有可能是方法,而不是属性

编辑: 我对WPF不是很有经验,但我认为这可能是一种绑定到方法而不是属性的方法:


LoadSomeStuffFromMyPath
完成之前,代码设置值不继续执行是否很重要?如果否,则激发并忘记;如果是,则不使用属性,请使用方法设置值。@Servy yes重要的是它不能继续。不幸的是,我使用的是WPF,所以我没有不使用属性的选项。@Justin984如果无法继续,为什么希望它是异步的?@ReedCopsey我想显示一个进度bar@Servyget和set都绑定到UI。没有上下文很难说,但考虑到它是WPF,很有可能在数据绑定中使用它,这就要求它是一个财产。你说得对。即便如此,我认为还是把这个放在这里比较好,因为这是一种非常常见的对财产的滥用,你同意吗?就我个人而言,不同意。如果这显然不是一个适用于这个问题的答案,我发现把它作为一个答案会让人分心。不,您需要有一个属性来进行绑定,您将无法使用方法。这不会导致执行继续,因为UpdateMyPathAsync()未被等待吗?@Justin984是,但是禁用UI会阻止用户做任何事情-如果您想让UI更新,就不能停止继续执行…我的意思是UpdateMyPathAsync()之后的任何操作都会立即执行。我没有提交完整的源代码,但在UpdateMyPathAsync之后,我有一些东西在加载文件之前不想执行。@Justin984然后将其包装在一个单独的异步方法调用中,这样您就可以控制操作顺序(这是我禁用/启用UI所做的)请注意,使用此解决方案,从
UpdateMyPathAsync
引发的异常将被忽略。