Я запускаю процедуру удаленной синхронизации на локальном мобильном устройстве. Он будет работать в своем потоке и, следовательно, может занять столько времени, сколько мы хотим. Я хочу использовать шаблон ожидания, но я не уверен, как это сделать, поскольку мой удаленный доступ использует функцию делегата. Извините, я "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.
благодаря
Я нашел ответ на другой вопрос - и он работает отлично.
Ответ можно найти здесь
Новый код в блоке 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);
}