C#在ContentView中使用等待运算符

问题描述 投票:0回答:2

我有问题。我在ContentView中创建了此Task<int>

public async Task<int> GetFollowers()
{
    var postData = new List<KeyValuePair<string, string>>();
    postData.Add(new KeyValuePair<string, string>("id", App.User.Id.ToString()));
    postData.Add(new KeyValuePair<string, string>("tk", App.Token.access_token));
    var content = new FormUrlEncodedContent(postData);
    var weburl = "mysite.org/followers_get.php";
    var response = await App.Client.PostAsync(weburl, content);
    var json = response.Content.ReadAsStringAsync().Result;

    return Convert.ToInt32(json);
}

现在我想用该呼叫的响应填充我的标签,所以我这样做:

public SideMenuHeader()
{
    InitializeComponent();
    string text = await GetFollowers().Result.ToString();
    txtSignedInFollowers.Text = text + " Followers";
}

但是该方法不是异步的,因此我无法使其异步,因此如何解决此问题?

c# xamarin xamarin.forms xamarin.android xamarin.ios
2个回答
0
投票

SideMenuHeader()方法中更改此行:

string text = await GetFollowers().Result.ToString(); 

像这样:

string text = (await GetFollowers()).ToString();

并且还将public SideMenuHeader()设为public async Task SideMenuHeader()

那应该解决它。

((这不是问题的原因,但也可以在GetFollowers()方法中,更改此行:

var response = await App.Client.PostAsync(weburl, content);

是这样:

var json = await response.Content.ReadAsStringAsync();

0
投票

C#cannot be async中的构造函数,因此您有两个选择:

首先,您可以等待异步调用完成:

string text = GetFollowers().Result.ToString();

((您基本上有这个,但是您必须删除“异步”)。但这是一个不好的选择,因为最好的情况是在进行Web查询时您的UI将冻结。最坏的情况是操作系统将声明您的应用因无响应而崩溃。通常,您不希望构造函数执行大量耗时的工作。

第二,您可以将调用异步方法的代码移到另一个方法中。查看覆盖OnAppearing方法,您可以can使它异步:

protected override async void OnAppearing()
{
    base.OnAppearing();
    string text = await GetFollowers().Result.ToString();
    txtSignedInFollowers.Text = text + " Followers";
}
© www.soinside.com 2019 - 2024. All rights reserved.