接続を開き、コマンドを送信し、回答(0〜10個の文字列文のリスト)を受信し、接続を閉じる単純な非同期ネットtcp wcfツールを構築しようとしました。
問題は、私が常に(自己ホスト型の)サービス側にいることです-何を試しても- 「スレッド終了またはアプリケーション要求のためにI / O操作が中止されました」、クライアント側ではもちろん対応する「既存の接続はリモートホストによって閉じられました」やタイムアウトなどのエラー。
ここ数日いろいろ試しましたが、なかなか抜けません。
クライアント側 (.NET 4.0 で実行、1 秒に 1 回呼び出される):
void callservice(string mykey) {
ServiceReference1.Client c = new ServiceReference1.Client();
c.GetDataCompleted += c_GetDataCompleted;
try {
c.GetDataAsync(mykey);
}
catch (FaultException aa)
{
c.Abort();
}
}
private void c_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e)
{
ServiceReference1.Client c = (ServiceReference1.Client)sender;
c.GetDataCompleted -= c_GetDataCompleted;
try
{
if (e.Result != null && e.Result.Length > 0)
{
... }
c.Close();
}
catch (Exception) {
c.Abort();
}
}
サーバー側 (.NET4.5 で実行):
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,
InstanceContextMode=InstanceContextMode.PerCall,IncludeExceptionDetailInFaults=true)]
public class Service1 : IMyService
{
public async Task<List<string>> GetData(string whatkey)
{
List<string> mydatalist = new List<string>();
mydatalist= await Task.Run<List<string>>(() =>
{
...
});
return mydatalist;
}
そこで何がうまくいかないのですか?それは WCF とはまったく関係のないことなのでしょうか? どうなり得るか?
サーバー側の例外:
System.Net.Sockets.SocketException、System、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089 スレッドの終了または System.ServiceModel.Channels.SocketConnection でのアプリケーション要求のため、I/O 操作が中止されました。 System.ServiceModel.Channels.SocketConnection.OnReceiveAsync (オブジェクト送信者、SocketAsyncEventArgs eventArgs) での HandleReceiveAsyncCompleted() System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure (SocketError socketError、Int32 bytesTransferred、SocketFlags フラグ) で System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback (UInt32 errorCode、UInt32 numBytes、NativeOverlapped* nativeOverlapped) System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode、UInt32 numBytes、NativeOverlapped* pOVERLAP) System.Net.Sockets で。SocketException (0x80004005): スレッドの終了またはアプリケーション要求 3E3 が原因で、I/O 操作が中止されました
もう 1 つの興味深い事実: SVCLogs は、I/O 例外が、
<connectionPoolSettings groupName="default" leaseTimeout="00:03:00"
idleTimeout="00:02:39" maxOutboundConnectionsPerEndpoint="20" />
設定。この例では、00:02:39 以降に初めて発生します。私の解釈:そこの設定のために開いている接続を閉じ、それがReceiveAsync操作i.ex以降の例外を引き起こします。まだ開いていました。
私の質問は、なぜ client.close() が完全に閉じないのか、c_getdatacompleted-event を呼び出しているときにまだ終了していないのはなぜですか? 操作が 02:39 分間「たむろ」し、終了しないのはなぜですか?
(接続プール設定を介して強制的に閉じない場合、netstat i.ex.を使用して表示すると、何百ものオープン操作が発生します)