2014-10-16 6 views
1

Xamarin 폼에서 Simple.OData.Client를 사용하여 Nortwind URL에서 데이터를 반입하려고합니다. 응용 프로그램이 영원히 중단됩니다. 간단한 프로젝트 소스 코드는 다음 링크에 있습니다 DownloadXamarin 폼에서 OData가 영원히 멈춤

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 내가 업데이트 한 내 코드를 기반으로. 아직도 영원히 걸려있다.

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!"); 
    } 
} 

답변

2

나는 이것이 당신이 비동기 전화를 시도하고 동기 만드는 방법 때문에 걸려 생각한다.

이 작업을 수행하는 중, 나는 현재 테스트로 이것을 수행하고 있으며 나중에 현재 변수가 해당 기능에만 국한되어 확장됩니다.

그래서 public static async Page GetMainPage()을하고 시도하고로 변경 : -

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

는 대부분 이전 구현에 걸려있다.

참고 가장 가능성이 비동기에게 선언을해야 할 것와 에 넣어이 모든 작업을 얻을 또한 GetMainPage() 함수를 호출 페이지로을 기다리고 있습니다.

정말 -하지만이 기능을 작업 <> 기능으로 사용하고 표시중인 페이지 내에서 기다리고 있습니다.

업데이트 1 : -

문제가 비동기에 관련이/ 문제를 기다리고 있습니다.

데이터 태스크는 데이터가 검색 될 때 후속 ListView.ItemsSource 제어를 갱신하는 작업 <> 복귀 별도 함수로 석출되었다.

+0

안녕 피트. 내 앱을 실행하지 못하게하는 사소한 일들이 누락 된 것 같습니다. 전자 메일을 통해 내 소스 코드를 보냈습니다. – casillas

+0

안녕하세요, 귀하의 제안에 따라 코드를 업데이트했습니다. 여전히 중단됩니다. – casillas

+1

방금 ​​수정본을 이메일로 보냈습니다. 그것은 나를 위해 작동합니다. 시도해보고 알려줘? – Pete

1

Pete가 의심 스러울 때 응용 프로그램이 동 기적으로 실행하려는 시도로 인해 가장 많이 응답합니다. 소스 코드를 검사하고 .Result 또는 .Wait()를 호출하는 모든 장소를 수정하십시오. 그렇다면 그것이 작동합니다. 리팩토링에 상당한 코드 재 작성이 필요할 수도 있지만 그 방법이 필요하다는 것을 알고 있습니다.

관련 문제