从setter属性等待异步函数

8

我需要在属性设置方法中等待异步函数。

public String testFunc()
{
get
{

}
set
{
    //Await Call to the async func <asyncFunc()>

}
}

我理解我们不应该创建异步属性,那么最优的方式是什么呢?


展示这篇帖子,我认为这是你的解决方案 https://dev59.com/cWw15IYBdhLWcg3wcrdC - rdn87
可能是重复的问题:如何从getter或setter中调用异步方法? - Michael Freidgeim
3个回答

13
你不能创建异步属性,也不应该这样做 - 属性意味着快速的、非阻塞的操作。如果你需要执行一个长时间运行的活动,正如你想启动一个异步操作并等待它所暗示的那样,根本不要将其作为属性。
移除设置器并创建一个方法代替。

+1 更加直截了当。它在 C# 中不受支持。只有方法、lambda 表达式或匿名方法可以使用 await - Leo
我完全同意你的观点。但是在属性的getter/setter中使用Task.Wait()仍然是可能的吗? - Domysee
1
@Domysee - 可能是可以的,但不建议这样做。 - Damien_The_Unbeliever
7
@Damien_The_Unbeliever,一般来说,我同意你关于setter的观点,但通常情况下,任何一般性规则都有例外。在这种情况下,MVVM模式经常需要从setter中执行异步操作,因为更改VM对象的属性值应视为事件。在WPF中避免这种情况往往会导致头痛、错误和/或混乱的代码。 - Yuval Perelman
3
当您有一个数据绑定的setter,比如筛选字段,并且您想要异步地开始加载数据到集合中时,是否有任何解决方案? - Arrow_Raider
1
@Damien_The_Unbeliever 我有一个WPF应用程序,其中使用数据绑定的ActualPageNumber属性。所以当我更改该属性时,setter应该访问数据库,这可能会很慢。这就是为什么我想要一个异步setter来保持GUI的响应性。 - Istvan Heckl

-1

您不能在属性中使用 async 函数。

替代方案:可以使用 Result 属性

public string UserInfo
{
    get => GetItemAsync().Result;
}

-2

使用

public bool SomeMethod
{
  get { /* some code */ }
  set
  {
    AsyncMethod().Wait();
  }
}
public async Task AsyncMethod() {}

[编辑]


使用.Wait()是个好主意 :) - Reiner
3
.Wait()”破坏了“异步(Asynchronous)”方法的宗旨。 - envyM6
6
即使代码编译通过,采用这种方法很容易导致死锁。参考链接 - John Wu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接