代码是这样的public delegate void RtnDelegate(string com, int address, int cid, int rtn, int len, string data);private void Rtn_DataRecived(string com, int address, int cid, int rtn, int len, string data)
        {
            this.BeginInvoke(new RtnDelegate(ShowDataRecived), com, address, cid, rtn, len, data);
        }private void ShowDataRecived(string com, int address, int cid, int rtn, int len, string data)
        {    txtShow.Text = data;                }Control.BeginInvoke在Winform中这样调用this.BeginInvoke(new RtnDelegate(ShowDataRecived), com, address, cid, rtn, len, data);但是换成Web中,怎么调用BeginInvoke我想到一个办法RtnDelegate rd = ShowDataRecived;
 rd.BeginInvoke(com, address, cid, rtn, len, data, null, null);但是如果这样写的话就txtShow.Text就显示不出任何值。我断点调试,txtShow.Text明明有值,不晓得是什么原因

解决方案 »

  1.   

    Control.BeginInvoke在Winform中这样调用
    这是异步调用,跨线程的
    换成Web中
    应该不要代理吧,直接赋值txtShow.Text试试
      

  2.   

    如下去掉代理试试
    private void Rtn_DataRecived(string com, int address, int cid, int rtn, int len, string data)
      {
      txtShow.Text = data; 
      }
      

  3.   

    注意一点,你在asp.net这样使用异步委托,当前页不会等待线程结束,而是页本身的代码执行完毕后就返回给客户端了,如果页返回的时候,线程没有执行完毕,Text不会有值的。当你调试的时候,由于断点消耗了时间,你看到Text有值,但是页已经返回给客户了。
      

  4.   


    不能这样做
    这样的话报错,线程间操作无效: 从不是创建控件“txtShow”的线程访问它。
      

  5.   

    我知道是这个原因
    但是应该怎么写才回让text有值?
      

  6.   


    参考asp.net多线程开发,http://dev.yesky.com/msdn/404/2387904.shtml
    本身asp.net提供自己的页内多线程方式
      

  7.   


    那你说应该用什么方法?
    我知道
    如果我在Rtn_DataRecived里面直接写ShowDataRecived(com,address,cid,rtn,len,data);
    结果是一样的
      

  8.   

    asp.net和winform不一样,在页面内开线程或异步委托,这种情况不多见。
      

  9.   

    是不多见,一般都是winform的。
    但是碰到要用web做,是没有办法
    只能请教了
      

  10.   

    第一次写web吧,别拿CS的模式往BS上套差别太大的。
      

  11.   

    汗~我本来就搞Web开发的,只是这次要把一个winfrom的应用改到web中来
    是不容易,winform中用的是Control.BeginInvoke
    没办法,我在web里面只好搞Delegate.BeginInvoke
      

  12.   

    同样的代码
    在winform应用程序中form1_Load中加了一句
    Control.CheckForIllegalCrossThreadCalls = false;winform就可以显示我想晓得,在web里面的解决方法应该怎样
      

  13.   

    不用异步委托的话
    我把
    RtnDelegate rd = ShowDataRecived;
     rd.BeginInvoke(com, address, cid, rtn, len, data, null, null);
    改为
    RtnDelegate rd = new RtnDelegate(ShowDataRecived);
                rd(com, address, cid, rtn, len, data);还是不行~~~
      

  14.   

    不要想当然的。套用   先了解你具体需要做什么功能异步委托 在winfrom表示 在子线程里面去调用主线程创建的控件  ,webfrom 
      

  15.   

    webform 里面 一般情况下很少用委托直接在事件里赋值text就行了
      

  16.   


    要是在winform中,这个问题就不是问题勒。直接在winform应用程序中form1_Load中加了一句
    Control.CheckForIllegalCrossThreadCalls = false;在webform就是稀奇社~~
    所以呀要怎么做呀~各位帮忙看下啦
      

  17.   

    我帮你分析下:第一。你如果使用的异步委托给Text赋值的话会存在一个问题,就是在赋值后由于异步的原因会把Text的值给弄掉的;第二。委托和事件的执行存在先后顺序
      

  18.   

    把代理放在globle中,我记得当时我就是这么做的,控制iE的active控件
      

  19.   

    protected void Page_Load(object sender, EventArgs e)
      {
      DelegateName asy = new DelegateName(MethodName);
      int i=5;
      int j=9;
      IAsyncResult ia=asy.BeginInvoke(i,out j,null,null);
      string r = asy.EndInvoke(out j, ia);
      txtShow.Text = "异步完成了!i的值是" + j.ToString()+"r的值是:"+r;
      }  private string MethodName(int num, out int ret)
      {
      ret = num;
      return "HelloWorld";
      }
      private delegate string DelegateName(int num, out int ret);  private void CallBackMethod(IAsyncResult ar)
      {
      int num;
      ((DelegateName)ar.AsyncState).EndInvoke(out num,ar);
      }
    这个可以解决问题的,我测试了的