Как получить доступ к объекту .net C #, который поступил в функцию делегата?

1

Я запускаю процедуру удаленной синхронизации на локальном мобильном устройстве. Он будет работать в своем потоке и, следовательно, может занять столько времени, сколько мы хотим. Я хочу использовать шаблон ожидания, но я не уверен, как это сделать, поскольку мой удаленный доступ использует функцию делегата. Извините, я "ma newby на С#, поэтому это, вероятно, простой вопрос.

В моем сценарии у меня есть следующий код:

       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.

благодаря

Теги:
wcf-data-services

1 ответ

0
Лучший ответ

Я нашел ответ на другой вопрос - и он работает отлично.

Ответ можно найти здесь

Новый код в блоке Try {} первого метода будет выглядеть следующим образом:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню