1

接続を開き、コマンドを送信し、回答(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.を使用して表示すると、何百ものオープン操作が発生します)

4

1 に答える 1

0

非同期 WCF 操作 ( AsyncPattern=true) は、非同期プログラミング モデルで実装されます。つまり、2 つの非同期操作 (「BeginOperation」と「EndOeration」) を使用して操作 (「Operation」) を実装します。Taskクライアントは、これらの操作を(おそらくFromAsyncオーバーロードで)ラップできます。

例えば:

[ServiceContract]
public interface ISampleTaskAsync
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginDoWork(int count, AsyncCallback callback, object state);

    int EndDoWork(IAsyncResult result);
}

WCF コントラクトはTask<T>

次に、クライアントで次のようなことができます。

var proxy = new Services.SampleTaskAsyncClient();
object state = "This can be whatever you want it to be";

var task = Task<int>.Factory.FromAsync(proxy.BeginDoWork, 
    proxy.EndDoWork, 10, state);

詳細については、次を参照してください。

を使用したい場合はTask<T>、必要ないと思いますAsyncPattern=true

于 2013-02-22T18:38:01.473 に答える