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