2017-06-28 15 views
1

私は、 "クライアント"からの呼び出しを受け取り、それを要求する "サーバー"プログラムを持っています。これらの呼び出しが実際にどのように行われているのだろうか?新しいスレッドが作成されていますか?クライアントからの着信 - 同じスレッドまたは異なるスレッド?

これらの呼び出しは、サーバで特定の条件が満たされるまで待つ必要があり、私が行うと質問していますwhile(conditionIsNotMet) Thread.sleep(x); - 私はメインスレッドの実行にいくつかの問題があることに気付いています。問題は、実際に待機している間に、メインの実行スレッドは非常に遅く、何らかの方法で中断されて悪い結果が生じることです。

これはアーキテクチャです:

enter image description here

私の質問は、(それがのほとんどを実行しているメインスレッド、コール(紫矢印)(サービスを作成した)メインスレッドを中断しない、あります新しいスレッドを作成しますか?

さらに、while(conditionIsNotMet) Thread.sleep(x);が問題を引き起こす原因が考えられますか?

同じ結果を得るには、より良い方法がありますか?

もっとコード:

public class MyServerCommands : MyInterface 
{ 
    public void SomeFunction(some parameters) 
    { 
     while (conditionIsNotMet) 
     { 
      Thread.Sleep(SomeTime); 
     } 
     // some more code - mainly, update a google spreadsheet 
    } 
} 

public partial class ProgramA : Form 
{ 
    // code for starting WCF server, creating background workers, and firing them 

    private void BkwMain_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (conditionIsNotMet) 
     { 
       // do work, mainly update google sheet 
     } 
     conditionIsNotMet = false; 
    } 
} 

UPDATE:だから、少し周りを再生した後、私は、サーバーを作成するスレッドが、それのコマンドを共有する必要があります一つであると結論づけることができると思います。私のアプリ(プログラムA)ではUIを担当するメインスレッドであったため、whileループが終了するまでUIが遅れてしまいました。 私の解決策は、今のところ、別のスレッド、または(親の)フォームでサーバーを作成し、それを隠そうとすることです(遅くなるので)。 もっと良い解決策がある場合は、私に知らせてください。

UPDATE /明確化Host = new ServiceHost(typeof(MyServerCommands), baseAddress);

答えて

1

それはあなたのサービスのInstanceContextModeConcurrencyModeが何であるかに依存します:私は、「サーバーの作成」で何を意味するかは、以下のコマンドです。

私はConcurrencyModeのデフォルトがシングルスレッドだと考えています。したがって、単一のサービスインスタンス(InstanceContextMode.Single)を実行している場合、メインスレッドはそれ以降の呼び出しをブロックします。

別のスレッドでコールを処理できるようにするには、ConcurrencyMode.Multipleが必要ですが、明らかにこれは他のスレッドに関する懸案事項を開きます。

詳細については、Sessions, Instancing, and Concurrencyを参照してください。

また、私は待っているwhileループでThread.Sleep()をお勧めしません。 ManualResetEventのような何らかの同期オブジェクトを待つ方が良いでしょう。

+0

ありがとう、私はこれらのリンクを見ていきます。 –

関連する問題