6

在客户端,每次我从 WCF 服务调用函数时,它都会等到 WCF 服务中的函数完成,就像调用本地函数一样。所以我为每个在新线程中启动预期函数的函数添加了一个额外的函数,所以我几乎所有的函数都是这样的:

EX:我从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();
        }
    }

关键是,当我从客户端发送文件时,它告诉服务开始接收,但如果我没有启动新线程,客户端将等待服务接收文件,并且不会发送文件数据。

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 中使用Add Service Reference,请检查顶部附近的对话框:有一个复选框显示Generate Asynchronous Operations。如果您使用的是svcutil.exe,则使用参数/async生成异步客户端方法。

于 2012-04-26T05:16:10.003 回答