使用WCF进行异步



我有一个依赖于单向WCF服务的Windows窗体应用程序;它只是从(Oracle)数据库返回数据。一些对wcf的客户端调用是长期运行的,现在我们需要实现一种异步捕获Oracle的DBMS_output并将其发送到客户端的方法。如何使用SignalR或类似的可以连接到WCF的东西来实现这一点?我们使用的是.NET framework 4.5。

@kims的答案是正确的,但为了进一步解释,我将添加控制器的示例。只是表明工作可以开始,然后稍后会发布一条消息。。。

/// <summary>
/// A realtime controller
/// </summary>
public class ZooController : XSocketController
{
    /// <summary>
    /// This method will be hit both from JavaScript, WCF and MVC examples
    /// Could have sent a custom object as well, but settled for a string in this case.
    /// </summary>
    /// <param name="message"></param>
    public void Say(string message)
    {
        //Just send it out to all subscribers
        this.SendToAll(new {message = "Longrunning process started"}, "say");
        Thread.Sleep(10000);
        this.SendToAll(new {message}, "say");
        //You can also use
        //this.Send, this.SendTo<T> etc...
    }
}

编辑:我不知道你的场景,但也许你可以使用这里描述的长期控制器选项

由于问题中标记了XSockets。。。

我会在客户端订阅一个主题,并让实时框架在长时间运行的任务完成后发布结果。

关于如何将WCF提升为实时的简单示例可以在这里找到:XSockets WCF该示例只是立即发布一个结果,但如果XSockets中调用的方法启动一个长时间运行的任务并在完成后发布结果,则工作完成时会通知客户端。

从WCF(或另一个半双工进程)调用XSockets控制器只需要两行代码

//Get a connection (if it exists already that one will be used)
var conn = ClientPool.GetInstance("ws://127.0.0.1:4502/Zoo", "*");
//We send an anonymous message here, but any object will work.
conn.Send(new { message = "I was sent over WebSockets: " + message },"Say");

相关内容

  • 没有找到相关文章

最新更新