为什么我的WCF服务方法只在我调用MessageBox.Show()后才能工作?

时间:2009-11-17 14:14:00

标签: c# wcf multithreading service messagebox

我有一个WCF服务,它提供了一个创建文件的方法。有时需要一段时间才能显示此文件,而其他依赖该文件存在的方法如果在之后立即调用则会失败。因此,我想在继续之前检查文件是否已出现。

在我的客户端类中,我可以调用服务方法,然后循环,直到文件出现,然后继续 - 这完全正常。但是如果我循环直到文件出现在服务方法内部时,从不发现文件已经创建 - 除非我在检查之前调用MessageBox.Show() 。如果我这样做,它几乎立刻就会发现它,就像我从客户端调用它一样。

该文件在服务方法查找期间肯定存在(编辑:不像我之前写的那样使用File.Exists()) - 那么为什么它找不到呢?为什么MessageBox.Show()解决了这个问题?

我认为它必须是我不理解的线程问题,因为它在服务外部工作,并且如果你调用MessageBox.Show()(阻止UI线程?),但是我在有点失落,所以任何帮助都会非常感激。

更多信息:如果与线程问题相关,则该服务由正在运行的GUI应用程序作为插件托管。谢谢大家。

编辑:这是代码的一个版本。我最初没有发布这个,因为它使用的是第三方库,所以我不确定它有多大帮助:

// 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 :(得分:0)

我没有看到您的代码,因此我可以建议以下内容: 要么在创建文件之前不返回第一个方法(您可能需要更改WCF的默认超时) 或者 - 只有第一次调用服务后返回 - 循环服务以查看文件是否存在。

没有看到您的代码,我只能猜到 - 如果您正在使用线程,则messagenox.show会按特定顺序进行调用(因为系统会等待您关闭消息框)。

答案 1 :(得分:0)

您可以实现回调,而不是在客户端中循环。那里有很多很好的例子 - http://www.google.com/search?q=wcf+callback+example