У меня есть служба WCF, которая предоставляет метод, который создает файл. Иногда для появления этого файла требуется некоторое время, и другие методы, основанные на существовании этого файла, перестают работать, если они вызываются сразу после этого. В результате я хочу проверить, что файл появился, прежде чем продолжить.
В моем клиентском классе я могу вызвать метод service и затем выполнить цикл, пока файл не появится, прежде чем продолжить - это работает отлично. Но если я зациклюсь, пока файл не появится, пока он находится внутри метода службы, он никогда не обнаружит, что файл был создан - , если я не вызову MessageBox.Show () перед проверкой. Если я это сделаю, он обнаружит это почти сразу, как если бы я позвонил клиенту.
Файл определенно существует в то время, когда метод службы ищет его (Edit: не использует File.Exists (), как я писал ранее) - так почему он не может его найти? И почему MessageBox.Show () решает эту проблему?
Я предполагаю, что это должна быть проблема с потоками, которую я не понимаю, поскольку она работает извне службы и работает, если вы вызываете MessageBox.Show () (который блокирует поток пользовательского интерфейса?), Но я нахожусь в немного потери, поэтому любая помощь будет принята с благодарностью.
Дополнительная информация: служба размещается как подключаемый модуль в работающем приложении с графическим интерфейсом, если это имеет отношение к проблеме потоков. Спасибо всем.
Редактировать: вот версия кода. Я не публиковал это изначально, потому что он использует стороннюю библиотеку, поэтому я не уверен, насколько это полезно:
// The WCF service, in which HasCompiled(name) never
// returns true unless MessageBox.Show() is called:
public void CompileScript(string name)
{
// CompileFile outputs a file to disk:
string debug = NWN2Toolset.NWN2ToolsetMainForm.Compiler.CompileFile(script.Name,GetModuleTempPath());
if (debug.Length > 0)
throw new InvalidDataException("'" + name + "' could not be compiled: " + debug);
// If the following line is commented out, this method never returns:
MessageBox.Show("blabla");
while (!HasCompiled(name));
}
public bool HasCompiled(string name)
{
NWN2GameModule module = GetModule();
OEIResRef cResRef = new OEIResRef(name);
IResourceEntry entry = module.Repository.FindResource(cResRef,resourceType);
return entry != null;
}
// The client class, in which HasCompiled(name) returns true almost immediately:
[Test]
public void TestCompilesScript()
{
service.AddScript(name,scriptContents);
service.CompileScript(name);
while (!service.HasCompiled(name)) {
Console.WriteLine("HasCompiled(" + name+ ") == false.");
}
Console.WriteLine("HasCompiled(" + name+ ") == true.");
}