【问题标题】:WCF call a function without waiting for it to finish its job?WCF 调用一个函数而不等待它完成它的工作?
【发布时间】:2012-04-26 05:03:31
【问题描述】:

在客户端,每次我从 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();
        }
    }

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

WCF 是否支持不让客户端等待服务功能完成的方式!或者我将不得不使用上述方法?

【问题讨论】:

    标签: c# multithreading wcf asynchronous asynchronous-wcf-call


    【解决方案1】:

    您正在寻找的是[OperationContract(IsOneWay = true)],更多详情请参阅http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

    【讨论】:

    • 是的。确实如此。默认情况下,此参数为 false,因此客户端将在函数执行时等待。当它设置为 true - 表示函数不返回任何内容,客户端不会等待答案。
    【解决方案2】:

    .NET 客户端代码生成工具内置了对此的支持——您不必手动生成每个方法的异步版本。

    如果您在 Visual Studio 中使用添加服务引用,请检查顶部附近的对话框:有一个复选框显示生成异步操作。如果您使用 svcutil.exe,则使用参数 /async 来生成异步客户端方法。

    【讨论】:

    • 这仍然不是最好的事情,因为您只是从服务客户端而不是服务启动另一个线程。如果您真的不关心将操作标记为单向的响应是最好的做法。
    • @nathangonzalez 好吧,Op 所说的是获得异步回调。如果您希望服务的多个实例运行,那么这就是 PerSessionPerCall 属性的用途。
    • @dbaseman 不,它不起作用,我仍然需要其他函数来返回值,事实上该服务已经具有 PerSession [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession)] 属性。内森·冈萨雷斯是对的。
    • @MurHafSoz 你看了我上面的回答了吗?生成异步服务引用会创建一个回调,它使用 IAsyncResult 将服务方法的结果异步发送到您的客户端。见这里:msdn.microsoft.com/en-us/library/system.iasyncresult.aspx
    • @dbaseman 是的,我读过它,我确实检查了生成异步操作。 ,也许它适用于类似的问题,对我来说最好的解决方案是在OperationContract 中使用 OneWay,无论如何感谢您的回答:)
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多