Дождитесь, пока другой метод завершит обновление списка, а затем выполнит другой метод для использования общего свойства

#c# #.net

#c# #.net

Вопрос:

У меня есть два метода:

 public List<int> MyData {get;set;}

public async Task MethodA(){
   // some logic here which process MyList
}

public async Task MethodB(){
   // This method takes time in execution and update MyData list
   MyData.Add(<Numeric value>);
}

 

Методb() вызывается отдельным приложением асинхронно, которое добавляет данные в список MyData (это процесс, требующий времени).

methodA(), который использует список MyData для получения результата, который выполняется отдельным приложением. Поскольку methodB() все еще работает и не полностью обновил список MyData, methodA() отправляет неполный список списка MyData в другое приложение.

Как я могу сохранить занятый метод () для отправки данных, как только список обновляется, или что-то для отправки полного списка в приложение?

Комментарии:

1. Методb() вызывается отдельным приложением асинхронно, как вы говорите. И когда это будет сделано, должен быть вызван метод A. Почему бы не вызвать A в конце B?

Ответ №1:

Почему бы не использовать экземпляр ConcurrentQueue вместо списка? Затем выполните вращение потока и удалите элементы из очереди, поскольку они, по-видимому, выполняются в methodA.

Комментарии:

1. Использовал его, но в моем случае он не работает, поскольку methodB() выполняется независимо, в то время как methodA() выполняется независимо и имеет общий список, который обновляется с помощью methodB(), для завершения которого требуется время.

2. Правильно, поэтому выполните всю необходимую работу, чтобы сгенерировать элемент (ы) для постановки в очередь в ConcurrentQueue, затем удалите из очереди из methodA. Это предотвратит эти проблемы.

Ответ №2:

Вам нужно будет использовать ключевое слово await для methodB и убедиться, что оно вызывается первым, а затем, как только methodB завершит вызов methodaчтобы использовать список.

 public List<int> MyData {get;set;}

public async Task MethodA(){
   // some logic here which process MyList
}

public async Task MethodB(){
   // This method takes time in execution and update MyData list
   MyData.Add(<Numeric value>);
}

public void CallingMethod()
{
await MethodB();  //Wait for method to update list
MethodA(); //When MethodB completes process list
}
 

Комментарии:

1. Проблема в том, что methodB() запускается в первый раз и обновляет список, в то время как methodA() выполняется, не зная о состоянии methodB() . Мы не можем контролировать выполнение methodB();

2. Это может быть просто над моей головой. Все еще учусь. Но хотелось бы увидеть код, если вы в этом разберетесь

Ответ №3:

Таким образом, в случае, когда у вас нет контроля в методе, который обновляет список или какую-либо общую переменную, где другие методы не обязаны ждать завершения первого метода, нам нужно вручную проверить, завершен ли этот процесс, если нет, то сначала снова проверить, выполнено ли это.

 public List<int> MyData {get;set;}
// Variable to check
Private bool IsMethodBCompleted {get;set;}

public async Task MethodA(){
   // some logic here which process MyList
   // Return IsMethodBCompleted  as param to this method so that client can know if completed
}

public async Task MethodB(){
   // This method takes time in execution and update MyData list
   MyData.Add(<Numeric value>);
   
   // Mark the property true when done loading
   IsMethodBCompleted = true;
}
 

Клиент получит доступ к methodA() и проверит, не завершен ли он, а затем снова вызовет его.