WCF,请教一个关于回调的问题

wpf250 2014-02-09 05:19:26
这是从博客园的例子摘抄的,一个关于回调的示例,由于代码较多,我下面只摘抄了服务实现类中的一段代码:

namespace Server
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class Service1 : IService1
{
static List<ISomeCallbackContract> m_Callbacks = new List<ISomeCallbackContract>();
public void DoSomething()
{
//获取调用客户端的实例通道
ISomeCallbackContract callback = OperationContext.Current.GetCallbackChannel<ISomeCallbackContract>();
if (m_Callbacks.Contains(callback) == false) //确定某元素是否在List<T>(m_Callbacks)中。http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=ZH-CN&k=k(System.Collections.Generic.List`1);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true
{
m_Callbacks.Add(callback);
}
Thread.Sleep(5000); //模拟长时间运行
CallClients();
}
static public void CallClients()
{
Action<ISomeCallbackContract> invoke = delegate(ISomeCallbackContract callback)
{
callback.SomeCallbackMethod();
};
m_Callbacks.ForEach(invoke);
}
}

class Program //寄宿程序
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(Service1));
host.Open();
Console.WriteLine("服务已启动!");
Console.Read();
}
}
}

上面的代码中,ISomeCallbackContract是回调契约,SomeCallbackMethod是回调方法。
我的问题是:
CallClients静态方法里面的逻辑是什么意思,看不懂呢?
...全文
130 点赞 收藏 8
写回复
8 条回复
claymore1114 2014年02月11日
构建 ForEach方法的参数,参数是一个委托,构建委托。 循环执行这个委托方法。
回复 点赞
qldsrx 2014年02月10日
引用 6 楼 u013560781 的回复:
我能看懂匿名函数和遍历。我想问的是,这里用遍历是什么意思啊,难道是任何一个客户端请求服务的时候,都让所有客户端去执行回调函数吗?这是什么用途呢?
就是这个意思,每个客户端都会被指向回调函数,不然就不叫遍历了。那个只是演示效果,没有实际意义,你看不懂他的含义是对的,因为现实当中没人会写这样的代码,真要写出这样的代码那就是思维混乱。 至于你说的一对多的通讯就不应该用双工来做,功能不一样,那个双工就好比UDP广播,QQ群,是多对多,任何人发信息,所有人都看得到,一对多要实现不是不行,而是杀鸡用牛刀了。你要自己处理请求的from-to匹配,还是要建这样的消息队列才行,还要考虑消息的离线存储(断线情况),还不如轮询服务端的消息队列,查找属于自己的最新消息更好。
回复 点赞
wpf250 2014年02月10日
引用 3 楼 Ptrtoptr 的回复:
ForEach是遍历每个ISomeCallbackContract对象并做为参数来调用invoke.我想你应该理解了吧
我能看懂匿名函数和遍历。我想问的是,这里用遍历是什么意思啊,难道是任何一个客户端请求服务的时候,都让所有客户端去执行回调函数吗?这是什么用途呢?
回复 点赞
wpf250 2014年02月09日
引用 1 楼 qldsrx 的回复:
不推荐使用WCF的双工模式编程,弊大于利,除非只是去学习,不可用于实际工业项目,否则麻烦的事会不断。
我对WCF的应用不是很多。不过,用WCF双工做在线客户服务,也就是一对多,一个客服对多个会员提供在线交流,有没有问题呢?
回复 点赞
Ptrtoptr 2014年02月09日
这个其实很简单,但我不知道怎么表达才能让你更易于理解. //关键是这句, 把它分两部分来解释 Action<ISomeCallbackContract> invoke 相当于定义了一个函数指针, 这个函数指针能指向没有返回值,带一个ISomeCallbackContract类型参数的函数. 也就是说,假设有这么样的A,B两个函数 ,那么我就个可把A,B的函数名赋值给invoke class DelegateTest{ //没有返回值,带一个ISomeCallbackContract类型参数的函数. static void A(ISomeCallbackContract callbackContract){} static void B(ISomeCallbackContract callbackContract){} static public void CallClients() { Action<ISomeCallbackContract> invoke ; invoke=A; invoke=B; } //下面这句就是 匿名函数 delegate(ISomeCallbackContract callback) { callback.SomeCallbackMethod(); } 它实际上正是返回值为void带一个ISomeCallbackContract的函数,只不过它没有名字. 它相当于如下的函数 void 匿名(ISomeCallbackContract callback) { callback.SomeCallbackMethod(); } 当把这个匿名函数的值给了invoke后,以后你再看到对的调用invoke就相当于在调用这个匿名函数. 再看下面这个回调列表, m_Callbacks.ForEach(invoke); 不用说回调列表里都是ISomeCallbackContract类型对象的集合,集合里的 元素正是invoke所需要的参数, ForEach是遍历每个ISomeCallbackContract对象并做为参数来调用invoke.我想你应该理解了吧
回复 点赞
qldsrx 2014年02月09日
先去看那个ISomeCallbackContract的定义,那个定义非常重要,用来规定在客户端执行的方法用的。 所谓的双工,就是这么处理的,服务端在某个时间(可以用定时器)执行客户端方法(回调函数),而客户端方法的定义在服务端是不知道的,服务端只能知道方法名,也就是那个ISomeCallbackContract接口定义里面的所有方法名,例如它有个SomeCallbackMethod方法,就去执行了。虽然代码在服务端调用,但最终都是在客户端执行的。事实上这个例子并不好,没有参数,因此仅仅执行了一个无意义的方法,一般回调函数都要带上参数传递给客户端,通知客户端具体消息内容,然后让客户端做处理。 如果你还是不能理解,先去看什么是委托,什么是事件。然后看异步操作里面的委托回调。不推荐使用WCF的双工模式编程,弊大于利,除非只是去学习,不可用于实际工业项目,否则麻烦的事会不断。
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告