2016-08-03 167 views
0

私はここにこの例外の百万のポストがあることを知っているが、私はここでこれを理解していない。 私はEXTREM簡単な例パイプ・サービスがあります。神秘的な=>パイプからの読み取り中にエラーが発生しました:パイプが終了しました。 (109、0x6d)

​​

をそして、私はそれを呼び出すときのものすべてがうまくあるが、2つのクライアントが同時にそれを呼び出すときに、この例外がスローされます。 サーバーは新しいスレッドを直接設定し、クライアントに戻ります。

public void RiskExport(long sraid, long revID, string JobID) 
{ 
ThreadStarter starter = new ThreadStarter(new ThreadStartWithParameter(RunExportJob), new SRAInfo() { sraid = sraid, revID = revID, JobID = JobID }); 
Thread t = new Thread(new System.Threading.ThreadStart(starter.ThreadStartEntry)); 
t.IsBackground = true; 
t.Start(); 
} 

したがって、タイムアウトの問題はありません。なぜなら、cleintからserverまで、そしてbackから1秒かかるからです。特にユニットテストのforループと同時に呼び出すと、

string JobID = ""; 
for (int i = 0; i < 100; i++) 
{ 
string baseAddress = "net.pipe://localhost/SRADocumentService"; 
ChannelFactory<ISRARiskExport> factory = new ChannelFactory<ISRARiskExport>(new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(baseAddress)); 
ISRARiskExport svc = factory.CreateChannel(); 
JobID = Guid.NewGuid().ToString(); 
svc.RiskExport(sraid, revID, JobID); 
} 

私はすべて準備が整いました。ここでは、各呼び出しで例外がスローされることがわかります。詳細ペインは私に何も助けにはなりません。例外は2回表示されます。=> パイプからの読み取り中にエラーが発生しました:パイプが終了しました。 (109、0x6d)。別のスタックトレースと

enter image description here

=>

enter image description here

enter image description here

コールバッククライアントである後に例外が長い来ることを私ものDebugViewで見る

。 私の質問は以下のとおりです。
  1. はなぜサービスは、それは彼らがすべてのログファイルを取得し、私は」ので、私は例外を取り除くことができますどのようにこの例外

  2. を投げてもexpectetとして働いていますそれを捕まえることはできません。

THXマイケル

+0

この例では、誰もあなたに手伝ってくれることはありません。あなたは投稿を編集したいかもしれません。 –

+0

haha​​ - すべてのコンテンツを追加できませんでした。私は歩いて行った。 –

答えて

0

我々が原因WCFで内部的に実装されたパイプはプールの名前どのようにそのような行動を見てきました。私たちのケースでは、そのような例外は、多かれ少なかれランダムに(各呼び出しの後ではなく)でしたが、MS参照ソースを調べた後、避けられないと判断しました。そして、あなたは「コールがクライアントに戻ってからずっと例外が来る」と言いました。これは、あなたが同じ振る舞いを観察していると思い込ませてくれます。

hereの「証明」が表示されます。NamedPipeConnectionPoolSettingsには、IdleTimeoutのデフォルト値が設定されています(2 minutes)。

は多分、我々は、私は今 NamedPipeConnectionPoolSettingsクラスが公開されていると IdleTimeoutプロパティも公開され、パイプとこれらの例外の閉鎖を防ぐ必要があります TimeSpan.MaxValueに設定することができることを見るので、これは避けられない我々の決定で間違っていました。

これが役に立ちます。

0

非常に似たトレースデータでこの同じシーケンス例外を取得していましたが、バインドを次のように変更した後に例外が停止しました。私はこれらの変更の意味が何であるか分からないので注意して使用してください。

public Binding GetBinding() 
    { 
     var binding = new NetNamedPipeBinding 
     { 
      OpenTimeout = TimeSpan.FromMinutes(15), 
      SendTimeout = TimeSpan.FromMinutes(15), 
      CloseTimeout = TimeSpan.FromMinutes(15), 
      MaxConnections = 200, 
      MaxBufferSize = int.MaxValue, 
      MaxReceivedMessageSize = int.MaxValue, 
      MaxBufferPoolSize = int.MaxValue, 
      TransactionFlow = false, 
      TransactionProtocol = TransactionProtocol.WSAtomicTransaction11, 
      TransferMode = TransferMode.StreamedRequest, 
      HostNameComparisonMode = HostNameComparisonMode.WeakWildcard 
     }; 
     binding.Security.Transport.ProtectionLevel = ProtectionLevel.None; 
     return binding; 
    } 
関連する問題