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
引发的异常将被忽略。