Исходя из того, что я понял по вашему вопросу, основная проблема заключается в том, что вы пытаетесь предсказать график вычислений Excel, предполагая, что события будут выполняться в определенном порядке, и что они всегда будут выполняться синхронно ... Оба из которых вы не можете надежно предсказать 100% времени.
Я бы предложил использовать другой, более надежный подход, когда вы отделяете запись от чтения:
Запись : Для кода C#, который пишет в электронную таблицу, сделайте именно это. Пишите и ничего не ждите (и ничего не читайте)
Чтение : Также на стороне C# подпишитесь на Application.SheetChange
и реагировать там - т. е. каждый раз, когда это событие запускается на стороне C#, считывайте нужные значения из электронной таблицы.
Таким образом, не имеет значения, кто изменил электронную таблицу. .. Если это был ваш код C#, код VBA или пользователь, изменивший его вручную. Вы знаете, что каждый раз, когда в электронной таблице происходит изменение, ваш код C# запускается и дает вам возможность реагировать (или нет) в зависимости от того, произошло ли изменение в списке, который вам небезразличен, а также что изменение произошло в диапазон, который вас волнует.
Псевдокод, как будет выглядеть ваш Application.SheetChange
:
public void Application_SheetChange(object sheet, Range range)
{
if (range.Worksheet.Name != "SheetYouAreInterested")
{
return; // nothing to do
}
if (!range.IntersectsWith(rangeYouAreInterested))
{
return; // nothing to do
}
// Read the values that changed, etc.
}
Теперь порядок событий также не важен, учитывая, что ваш обработчик событий будет выполняться каждый раз, когда происходит изменение, поэтому любые устаревшие значения, которые вы, возможно, прочитали раньше, будут в конечном итоге обновлены к моменту последнего запуска события.
Конечно, код чтения не должен вносить какие-либо изменения в непосредственно лист ... Он должен только читать, иначе вы застряли бы в бесконечном l oop: D