×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

没人问答,我这个半桶水来瞎说说。

早期.NET版本没有FTP的部件,自己动手做过一个,用Socket/TcpClient/TcpListener等一些东西,别的基于TCP的东西应该也脱离不了它们,同步就把发送/接收放在同一线程(Thread)里,这样程序就死等直到接收完成,异步就把接收放到后台线程,主线程可以做别的事,当后台线程完成接收,再回调主线程,除非主线程特别忙,后台线程插不进来,connection就占用主,一般情况下应该不影响性能。

另外我觉得从connection建立到callback结束,connection是被hold住的,会有个timeout的值,在规定时间没完成动作,connection就自杀了,产生一个Timeout的错误。

总的来说除非调用者线程特别忙,用callback应该不会影响性能,反过来系统要是达到瓶颈,不用callback性能估计也不行。
Report

Replies, comments and Discussions:

  • 工作学习 / 学科技术讨论 / silverligth+WCF callback 问题。要实现,会有performance impact吗?有两个地方考虑。
    一是web client <-> web server。虽然是SL,应该是和javascript callback/ajax差不多的原理吧。不知道这在内部是怎么实现的。会给web server造成影响嘛?然后web server <-> MT的wcf callback,web server会hold一个active connection到MT吗?这样会对web server和MT的socket resource有影响吗?
    • 没人问答,我这个半桶水来瞎说说。
      早期.NET版本没有FTP的部件,自己动手做过一个,用Socket/TcpClient/TcpListener等一些东西,别的基于TCP的东西应该也脱离不了它们,同步就把发送/接收放在同一线程(Thread)里,这样程序就死等直到接收完成,异步就把接收放到后台线程,主线程可以做别的事,当后台线程完成接收,再回调主线程,除非主线程特别忙,后台线程插不进来,connection就占用主,一般情况下应该不影响性能。

      另外我觉得从connection建立到callback结束,connection是被hold住的,会有个timeout的值,在规定时间没完成动作,connection就自杀了,产生一个Timeout的错误。

      总的来说除非调用者线程特别忙,用callback应该不会影响性能,反过来系统要是达到瓶颈,不用callback性能估计也不行。
      • 问个问题,这种异步的线程函数怎样强行终止?
        比如我有这样一个代理Action

        main()
        {
        Action a = ()=>
        {
        f();
        };

        a.BeginInvloke(s=>
        {
        Action x = (Action)s.AsyncStatue;
        x.EndInvoke();
        },a);

        Console.ReadLine();
        }

        void f() { while(true); }

        f()是一个永远不会结束的函数,我想用外力终止这个异步线程,该怎么做?

        用普通的多线程我知道可以用About()等等强行终止,但是对于异步调用,我没找到答案

        多谢
        • 简单的方法定义一个全局变量,别的线程修改它,在f()里用它判断是否终止,f()里每做一步还要让它休息一下(Thread.CurrentThread.Sleep(1); ), 以便让别的线程有机会运行。
          • 可是现实是我无法修改f()
            • 把活放BackgroundWorker Class 里,它提供终止的方法。再不行,
              就关机器。
              • ^_^ ,我觉得这是异步调用架构的一个缺陷,微软应该提供一个函数强行终止后台线程,而不是单纯的在那里等待线程结束,但愿.Net 5.0能够解决这个问题
                • 这不都在有了
                  BackgroundWorker.CancelAsync Method
                  Thread.Abort
                  和前面说的方法
            • who designed this? ask him...
    • Web is stateless. web client address is varying over time. even if the connection isn't closed immediately on the server side, the server has no way to know where the client is in the next second. pls look at WCF duplex .
      • 我想着binginInvoke, 用wsDualHttpBinding是个好方法。
      • web server <-> MT的wcf callback,要是用nettcpbinding,web server是会hold
        一个active connection的。当然我想这样也会对web server和MT的socket resource有影响因为每一个callback要用一个socket port嘛。 还没试wsdualhttpbinding。但我想原理应该还是差不多吧。web server总还是要keep an active connection (http connection in this case) open for callback 嘛。
        • +1. 我猜你是对的,要不然微软不会说"Note that the event-like behavior of duplex services only works within a session. "。