首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从getter或setter调用异步方法?

如何从getter或setter调用异步方法?
EN

Stack Overflow用户
提问于 2011-07-07 04:06:00
回答 11查看 163.6K关注 0票数 284

在C#中从getter或setter调用异步方法最优雅的方式是什么?

这里有一些伪代码来帮助我解释。

代码语言:javascript
复制
async Task<IEnumerable> MyAsyncMethod()
{
    return await DoSomethingAsync();
}

public IEnumerable MyList
{
    get
    {
         //call MyAsyncMethod() here
    }
}
EN

回答 11

Stack Overflow用户

发布于 2011-07-07 04:16:51

你不能异步调用它,因为没有异步属性支持,只有异步方法。因此,有两种选择,都利用了CTP中的异步方法实际上只是一个返回Task<T>Task的方法这一事实。

代码语言:javascript
复制
// Make the property return a Task<T>
public Task<IEnumerable> MyList
{
    get
    {
         // Just call the method
         return MyAsyncMethod();
    }
}

或者:

代码语言:javascript
复制
// Make the property blocking
public IEnumerable MyList
{
    get
    {
         // Block via .Result
         return MyAsyncMethod().Result;
    }
}
票数 114
EN

Stack Overflow用户

发布于 2019-08-03 02:05:59

您可以像这样使用Task

代码语言:javascript
复制
public int SelectedTab
        {
            get => selected_tab;
            set
            {
                selected_tab = value;

                new Task(async () =>
                {
                    await newTab.ScaleTo(0.8);
                }).Start();
            }
        }
票数 11
EN

Stack Overflow用户

发布于 2015-04-02 15:15:50

我认为我们可以等待值首先返回null,然后获得真正的值,所以在纯MVVM (例如PCL项目)的情况下,我认为以下是最优雅的解决方案:

代码语言:javascript
复制
private IEnumerable myList;
public IEnumerable MyList
{
  get
    { 
      if(myList == null)
         InitializeMyList();
      return myList;
     }
  set
     {
        myList = value;
        NotifyPropertyChanged();
     }
}

private async void InitializeMyList()
{
   MyList = await AzureService.GetMyList();
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6602244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档