我看到WCF并不直接使用事件,而是使用OneWay委托调用,但是有人可以向我展示一个有关如何执行此操作的简单示例吗?

这是我现在设置的内容:

    [OperationContract(IsOneWay = true)]
    void OnGetMapStoryboardsComplete(object sender, List<Storyboard> results);

最佳答案

假设您的回调协定接口称为IMyServiceCallback,则当服务要引发事件时,它将执行以下代码:

IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>();
callback.OnGetMapStoryboardsComplete(...);


我发现this article非常有帮助。它描述了瞬态事件系统和持久性事件系统,这两个系统都应满足任何和所有事件方案IMO。

高温超导

设置回调合同:

interface IMyServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void OnGetMapStoryboardsComplete(object sender, List<Storyboard>);
}


然后,您需要在服务合同上指出它正在使用此回调:

[ServiceContract(CallbackContract = typeof(IMyServiceCallback))]
interface IMyService
{
    // ...
}


完成并实现服务后,请创建对该服务的引用。然后,客户端将必须包含实现IMyServiceCallback的类:

class EventHandler : IMyServiceCallback
{
    public void OnGetMapStoryBoardsComplete(object sender, List<Storyboard>)
    {
        // Do whatever needs to be done when the event is raised.
    }
}


当您从客户端连接到服务时,您需要将其传递给InstanceContext,该引用了将处理事件的对象:

EventHandler eventHandler = new EventHandler();
MyServiceClient client = new MyServiceClient(new InstanceContext(eventHandler));


那有意义吗?

10-08 11:23