Почему мой метод службы WCF работает только после того, как я вызвал MessageBox.Show ()? - PullRequest
1 голос
/ 17 ноября 2009

У меня есть служба 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.");
}

Ответы [ 2 ]

0 голосов
/ 25 декабря 2009

Вместо того, чтобы зацикливаться на клиенте, вы можете вместо этого реализовать обратный вызов. Есть много хороших примеров - http://www.google.com/search?q=wcf+callback+example

0 голосов
/ 17 ноября 2009

Я не вижу ваш код, поэтому могу предложить следующее: либо не возвращайте первый метод до тех пор, пока файл не будет создан (вам может потребоваться изменить время ожидания по умолчанию для WCF) Или - только после , когда возвращается первый вызов Службы - цикл для службы, чтобы увидеть, существует ли файл.

Не видя ваш код, я просто могу догадаться - если вы используете потоки, messagenox.show выполняет вызовы в определенном порядке (потому что система ожидает от вас закрытия окна сообщения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...