Я пытаюсь использовать PortableRest для выполнения асинхронного вызова службы Web API 2.2 Rest из Xamarin Forms.
Я думаю, что у меня какая-то проблема с контекстом взаимоблокировки / синхронизации, но я не могу ее решить (новичок в async и т. Д.).
Кто-нибудь может помочь?
Мой метод тестирования контроллера (удален любой вызов базы данных) -
public IEnumerable<ContentModel> GetTestRest()
{
return new List<ContentModel> {
new ContentModel() {Categoryid = 1, Title = "Title"}};
}
Мои прохождения модульного теста -
[TestMethod]
public async Task TestRest()
{
MyNewsApiClient MyNewsApiClient = new MyNewsApiClient();
var models = await MyNewsApiClient.TestRest();
int count = models.Count;
Assert.AreEqual(1, count);
}
Мой метод прокси PortableRest (PCL) -
public async Task<List<ContentModel>> TestRest()
{
var request = new RestRequest();
request.Resource = "Content/GetTestRest";
return await ExecuteAsync<List<ContentModel>>(request);
}
Xamarin Forms ContentPage (PCL) -
public partial class NewsType1CP : ContentPage
{
public NewsType1CP ()
{
InitializeComponent ();
}
protected override void OnAppearing ()
{
LoadData (); // this is a sync call of an async method, not sure how else to approach, make OnAppearing async?
}
public async Task LoadData ()
{
Debug.WriteLine ("LoadData");
HeaderLabel.Text = "Load Data!";
MyNewsApiClient api = new MyNewsApiClient ();
var cm = await api.TestRest ();
// this will work on its own, control returns to this method - await api.GetDelay ();
HeaderLabel.Text = "After! - ";
NewsListView.ItemsSource = cm;
}
}
Ожидание api.TestRest () никогда не приводит к установке HeaderLabel.After или ListView.
Если я просто добавлю тестовый прокси-метод GetDelay (), который не вызывает PortableRest через return await ExecuteAsync> (request);
public async Task<bool> GetDelay ()
{
await Task.Delay (1000);
return true;
}
Потом все "работает".
Спасибо за вашу помощь, при необходимости я скачаю исходный код PortableRest (в настоящее время используется Nuget dll), просто не был уверен, не хватает ли чего-то базового на этом верхнем уровне.