2014-07-23 1 views
1

로컬 모바일에서 원격 동기화 루틴을 실행 중입니다. 자체 스레드에서 실행되므로 시간이 오래 걸릴 수 있습니다. 대기 패턴을 사용하고 싶지만 원격 액세스가 대리자 기능을 사용하므로이 작업을 수행하는 방법을 잘 모릅니다. 미안 해요, "C 번호에 엄마 뉴비는 그래서 이것은 아마 쉬운 질문입니다 내 시나리오에서델리게이트 함수에 도착한 .NET C# 객체에 액세스하는 방법?

나는 다음과 같은 코드가 있습니다. 클래스에서 나는 방법을 실행하는 것이

 public static void testREADLiveConnection() 
    { 

     Uri tmaLiveDataRoot = new Uri("https://xxx.azurewebsites.net/xxx.svc/"); 
     TMLiveData.TMALiveData mLiveData = new TMLiveData.TMALiveData(tmaLiveDataRoot); 
     mResult = null; 


     DataServiceQuery<TMLiveData.JobType> query = (DataServiceQuery<TMLiveData.JobType>)mLiveData.JobTypes.Where(c => c.IsActive == true); 
     mLiveData.Credentials = new System.Net.NetworkCredential("xx", "yy"); 

     mResult = "Trying to READ the data"; 
     try 
     { 
      query.BeginExecute(OnQueryComplete, query); 
     } 
     catch (Exception ex) 
     { 
      mResult = "Error on beginExecute: " + ex.Message; 
     } 


    } 

    private static void OnQueryComplete(IAsyncResult result) 
    { 

     DataServiceQuery<TMLiveData.JobType> query = (DataServiceQuery<TMLiveData.JobType>) result.AsyncState; 
     mResult = "Done!"; 
     try 
     { 
      foreach (TMLiveData.JobType jobType in query.EndExecute(result)) 
      { 
       mResult += jobType.JobType1 + ","; 
      } 
     }catch (DataServiceClientException ex) 
     { 
      mResult = "Error looping for items: (DataServiceClientException)" + ex.Message; 
     } 
     catch (DataServiceQueryException ex2) 
     { 
      mResult = "Error looping for items: (DataServiceQueryException)" ; 
     } 
     catch (Exception ex3) 
     { 
      mResult = "Error looping for items: (general exception)" + ex3.Message; 
     } 

    } 

중요한 점은을하는 응답이 올 때 호출되는 대리자 기능이

질문 :... 내가 응답을 기다린를받을 수 있도록 내가 다른 클래스에서이 클래스를 사용할 수있는 방법

을 즉, 내가 원하는

testLSCon newRemoteObject; 

listOfJobTypes = await newRemoteObject.testREADLiveConnection(); 

그러면 listOfJobTypes로 원하는 것을하십시오.

감사합니다.

답변

0

나는 다른 질문에 대한 답을 찾았습니다. 완벽하게 잘 작동합니다.

대답은 here

발견 된 첫 번째 방법의 시도 {} 블록에 새로운 코드가된다 :

 try 
     { 
  //method 2 doing inline 
      TaskFactory<IEnumerable<TMLiveData.JobType>> tf = new TaskFactory<IEnumerable<TMLiveData.JobType>>(); 
      IEnumerable <TMLiveData.JobType> jobTypes = await tf.FromAsync(query.BeginExecute(null, null), 
             iar => query.EndExecute(iar)); 
      foreach (TMLiveData.JobType jobType in jobTypes) 
      { 
       mResult += jobType.JobType1 + ","; 
      } 


      //method 1 using the onQueryComplete delegate function 
      //query.BeginExecute(OnQueryComplete, query); 
     }