1

ファイルを作成するメソッドを提供する 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.");
}
4

2 に答える 2

0

クライアントでループする代わりに、代わりにコールバックを実装できます。そこにはたくさんの良い例があります-http ://www.google.com/search?q=wcf+callback+example

于 2009-12-25T06:36:04.120 に答える
0

あなたのコードが表示されないので、次のことを提案できます:ファイルが作成されるまで最初のメソッドを返さない(WCFのデフォルトのタイムアウトを変更する必要があるかもしれません)または-サービスへの最初の呼び出しが返されたにのみ-サービスに対してループして、ファイルが存在するかどうかを確認します。

あなたのコードが表示されていないことは推測できます-スレッドを使用している場合、messagenox.show は特定の順序で呼び出しを行います (システムがメッセージボックスを閉じるのを待つため)。

于 2009-11-17T14:26:52.563 に答える