在每次从WCF服务调用函数时,在客户端,它等待直到WCF服务上的函数完成,就像调用本地函数一样。所以我为每一个在新线程中启动预期函数的函数添加了一个额外的函数,所以我的几乎所有函数都是这样的:
EX:
我从客户端端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();
}
}
关键是,当我从客户端发送文件时,它告诉服务开始接收,但如果我没有启动新线程,客户端将等待服务接收文件,并且不会发送文件数据
WCF也支持一种不会让客户端等待服务功能完成的方式!或者我将不得不使用上述方法?
答案 0 :(得分:15)
您要查找的内容为[OperationContract(IsOneWay = true)]
,有关详细信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163537.aspx
答案 1 :(得分:1)
.NET客户端代码生成工具内置了对此的支持 - 您不必手动生成每个方法的异步版本。
如果您在Visual Studio中使用添加服务引用,请检查顶部附近的对话框:有一个复选框,上面显示生成异步操作。如果您使用的是 svcutil.exe ,请使用参数 / async 生成异步客户端方法。