OData永远挂在Xamarin形态



我正试图使用Xamarin形式的Simple.OData.Client从Nortwind URL获取数据。应用程序永远挂起。简单的项目源代码在以下链接中:下载

using Simple.OData.Client;
public async void InitializeDataService(){
    try {
        mODataClient = new ODataClient("http://services.odata.org/Northwind/Northwind.svc/");
    }
    catch {
        await DisplayAlert("Error", "Connection Error", "OK", "Cancel");
        System.Diagnostics.Debug.WriteLine("ERROR!");
    }
}
public async void GetDataFromOdataService (string myDataClicked){
    try {
        myCustomers= mODataClient.For(myDataClicked).Top(10).FindEntriesAsync().Result;
    }
    catch {
        await DisplayAlert("Error", "Connection Error", "OK", "Cancel");
        System.Diagnostics.Debug.WriteLine("ERROR!");
    }
}

更新:1我已经根据Pete的建议更新了我的代码。永远挂着。

private ODataClient mODataClient;
private IEnumerable <IDictionary<string,object>> myCustomers;
public ObservableCollection <Customer>Customers { get; set;}
public string myDataString;
public MyDataServices (string myDataClicked)
{
    Title="Customers";
    myDataString = myDataClicked;
    callServices();
}
public async Task callServices()
{
    await InitializeDataService ();
    await GetDataFromOdataService (myDataString);   
}
public async Task InitializeDataService(){
    try {
        mODataClient = 
            new ODataClient("http://services.odata.org/Northwind/Northwind.svc/");
    }
    catch {
        await DisplayAlert("Error", "Connection Error", "OK", "Cancel");
        System.Diagnostics.Debug.WriteLine("ERROR!");
    }
}
public async Task GetDataFromOdataService (string myDataClicked){
    try {
        myCustomers= mODataClient.For(myDataClicked).Top(10).FindEntriesAsync().Result;
    }
    catch {
        await DisplayAlert("Error", "Connection Error", "OK", "Cancel");
        System.Diagnostics.Debug.WriteLine("ERROR!");
    }
}

我怀疑这是挂起的,因为您试图调用async并使其同步。

在你这样做的地方,我认为你现在只是作为一个测试来做,稍后你会扩展,因为目前你的变量只是该函数的局部变量。

所以尝试执行public static async Page GetMainPage(),并更改为:-

var customers= await mODataClient.For("Customers").Top(10).FindEntriesAsync();

因为它很可能挂在您以前的实现上。

请注意,您很可能需要执行async声明,并向调用GetMainPage()函数的页面放入wait,以使所有这些工作正常进行。

真的-不过-我会把这当成一项任务<>函数,并在您显示的页面中等待它。

更新1:-

问题与异步/等待问题有关。

数据任务被分离为一个单独的函数,返回任务<>,随后在检索数据时更新ListView.ItemsSource控件。

正如Pete所怀疑的,应用程序挂起很可能是由于您试图同步运行它。检查源代码并修改所有调用.Result或.Wet()的地方。然后它应该可以工作了。我知道这样的重构可能需要大量的代码重写,但这是必须的。

最新更新