6

クライアント側では、WCF サービスから関数を呼び出すたびに、ローカル関数を呼び出すように、関数が WCF サービスで完了するまで待機します。したがって、新しいスレッドで目的の関数を開始する関数をそれぞれに追加して、ほとんどすべての関数が次のようになるようにしました。

例: CLIENT
から関数を呼び出します:client.ReceiveFile()

private void SendFile(Socket socket, Job job, DoWorkEventArgs e)
    {
        UpdateInfo(job.Name, job.Icon, job.Size);
        client.ReceiveFile((_File)job.Argument, bufferSize);
        SizeAll = job.Size;
        UpdateCurrFile(((_File)job.Argument).Path, "1");
        SendX(socket, ((_File)job.Argument).Path, e);
    }

サーバーでは、次のようにする必要があります。

 public void ReceiveFile(_File file, int bufferSize)
    {
        System.Threading.Thread th = new System.Threading.Thread(unused => ReceiveFileTh(client, file.Name, file.Size, bufferSize));
        th.Start();
    }
    private void ReceiveFileTh(Socket client, string destPath, long size, int bufferSize)
    {
        try
        {
            ReceiveX(client, destPath, size, bufferSize);
        }
        finally
        {
            CloseClient();
        }
    }

ポイントは、クライアントから sendFile を送信すると、サービスに受信を開始するように指示しますが、新しいスレッドを開始しなかった場合、クライアントはサービスがファイルを受信するのを待機し、ファイル データを送信しません。

WCF は、サービス関数が完了するまでクライアントを待たせない方法をサポートしています。または、上記の方法を使用する必要がありますか?

4

2 に答える 2

15

[OperationContract(IsOneWay = true)] 詳細については、http ://msdn.microsoft.com/en-us/magazine/cc163537.aspxを参照してください。

于 2012-04-26T05:22:26.477 に答える
2

.NET クライアント コード生成ツールには、これに対するサポートが組み込まれています。すべてのメソッドの非同期バージョンを手動で生成する必要はありません。

Visual Studio で [サービス参照の追加]を使用している場合は、上部にあるダイアログ ボックスをオンにします。 [ Generate Asynchronous Operations ] というチェックボックスがあります。svcutil.exeを使用している場合は、パラメーター/asyncを使用して非同期クライアント メソッドを生成します。

于 2012-04-26T05:16:10.003 に答える