Если SaveAs не является потокобезопасным, как описано Джоном Кернером в комментарии, вы можете попытаться заблокировать SaveAs и закрыть.
В этом случае я уверен, что многопоточный процесс больше не будет полезным, но это худшая попытка. По крайней мере, вы будете знать, если ваша ошибка исходит от функции SaveAs.
Чтобы добавить информацию после вашего комментария:
добавить переменную класса для создания блокировки
private static object _savelock = new object();
Тогда у вас рабочий:
lock(_savelock)
{
document.SaveAs(ref path, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o);
}
document.Close();
В этом случае операция сохранения не будет выполняться одновременно. Также может потребоваться блокировка закрытия
- 1 поток взять замок и сохранить
- Тем временем 2 потока попытайтесь сохранить, но подождите, пока предыдущий поток завершит сохранение и снимет блокировку
В этом случае вам все равно, является ли это тем же самым словом или нет. в обоих случаях это будет работать.
Основным недостатком является то, что если операция сохранения занимает 95% времени потока, многопоточность становится практически бесполезной, поскольку при блокировке операции сохранения только 5% процесса действительно многопоточны. Однако, если целью является «освобождение» пользовательского интерфейса и предоставление возможности пользователю продолжать работу во время работы процесса, это жизнеспособное решение.
Проверьте http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx на стоимость замка в два раза