从异步方法分配变量

时间:2015-11-19 22:38:15

标签: c# wcf asynchronous

我无法调用我的异步方法...我想调用该方法,以便我可以使用该方法内部变量中的值。 注意ViewDetailsAsync来自网络服务。

这就是我所拥有的:

namespace TilesAndNotifications.Models
{
public class PrimaryTile
{
    public async void GetTileData()
    {
        ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
        string name= string.Empty;
        string description = string.Empty;
        string type= string.Empty;

        var res = await client.ViewDetailsAsync();

        name= res.NameView;
        description = res.DescriptionView;
        type= res.TypeView;
    }

    public string CurrentName { get; set; } = "John Doe";
    public string CurrentDescription { get; set; } = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.";
    public string CurrentType { get; set; } = "Employee";
}
}

我想要完成的事情

public string CurrentName { get; set; } = GetTileData.name;
public string CurrentDescription { get; set; } = GetTileData.description
public string CurrentType { get; set; } = GetTileData.type;

但我不确定是从异步方法中提取这些信息......我知道这可能是基本的,但我似乎无法得到它。

2 个答案:

答案 0 :(得分:1)

您不能使用属性默认值来执行此操作,并且由于类构造不是异步的,因此除非您实现同步等待,否则您将无法在构造函数上执行此操作:

public PrimaryTile()
{
     var titleData = GetTitleData().Result;
}

无论如何,这是一个非常非常糟糕的主意,因为如果你不小心实现异步/线程代码,它可能会在某些条件下产生死锁

可能您需要重新考虑您的架构并制定更好的解决方案。

答案 1 :(得分:1)

您可以使用async方法设置属性:

public async Task GetTileDataAsync()
{
  ...
  var res = await client.ViewDetailsAsync();

  CurrentName = res.NameView;
  CurrentDescription = res.DescriptionView;
  CurrentType = res.TypeView;
}

当然,在使用这些属性之前,调用代码必须awaitGetTileDataAsync返回的任务。