none
c# 里面访问两个网页源码,同时去访问, RRS feed

  • 问题

  • c# 里面访问两个网页源码,同时进行怎么写呢

    比如  string stra=gethtm(urla)

    string strb=gethtm(urlb)

    这样的程序就是取到stra后,在去strb;

    如果我想stra ,和strb 同时进行,怎么写呢

    怎样限制stra 和strb 用时呢??

     

    2010年4月12日 9:54

答案

  • “同时”这个概念比较纠结,以前的说法,即使是多线程的话,执行的时候也是一先一后的,不存在同时,不过现在有了多核,咱就忍了……

    典型的方法是多线程,如果有俩cpu的话可以实现真正意义上的同时(可惜只有一块网卡,信息还是按顺序发送的,这块就不去计较了)。不过更简单的方法就是异步处理,把多线程操作让给系统去做。

    不过关键还是看你gethtm里面是怎么实现的,如果可以改成异步操作,那么用异步最方便,否则还是考虑多线程好了。

    至于用时的问题,这里应该是指网络超时吧,可以在socket操作或者其他封装里指定超时时间。


    霸王
    2010年4月12日 12:01
  • 感觉你使用 多线程比较合适,不知道你的具体需求,给你写了个DEMO.希望对你有帮助

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form4 : Form
        {
            
            public Form4()
            {
                InitializeComponent();
               
            }
            delegate void SetTextCallback(string text);
            private void SetText(string text)
            {
                // InvokeRequired需要比较调用线程ID和创建线程ID
                // 如果它们不相同则返回true
                if (this.label1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.label1.Text = text;
                }
            }
    
            private void SetTextBB(string text)
            {
                // InvokeRequired需要比较调用线程ID和创建线程ID
                // 如果它们不相同则返回true
                if (this.label1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetTextBB);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.label2.Text = text;
                }
            }
         
    
    
            private void button1_Click(object sender, EventArgs e)
            {
           
                System.Threading.Thread t = new Thread(delegate()
                {
                    AA(1);
                });
                t.Start();
    
                System.Threading.Thread t1 = new Thread(delegate()
                {
                    BB(1);
                });
                t1.Start();
    
            }
            private void AA(int a)
            {
                string saa="";
                for (int i = 0; i < 10; i++)
                {
                    saa += "--" + i.ToString();
                    SetText(saa);
                    System.Threading.Thread.Sleep(1000);
                }
           
            }
    
            private void  BB(int B)
            {
                string bbb = "";
                for (int i = 0; i < 10; i++)
                {
                    bbb+= "$" + i.ToString();
                    SetTextBB(bbb);
                    System.Threading.Thread.Sleep(1000);
                }
             
            }
        }
    }
    

    努力+方法=成功
    2010年4月12日 13:04

全部回复

  • “同时”这个概念比较纠结,以前的说法,即使是多线程的话,执行的时候也是一先一后的,不存在同时,不过现在有了多核,咱就忍了……

    典型的方法是多线程,如果有俩cpu的话可以实现真正意义上的同时(可惜只有一块网卡,信息还是按顺序发送的,这块就不去计较了)。不过更简单的方法就是异步处理,把多线程操作让给系统去做。

    不过关键还是看你gethtm里面是怎么实现的,如果可以改成异步操作,那么用异步最方便,否则还是考虑多线程好了。

    至于用时的问题,这里应该是指网络超时吧,可以在socket操作或者其他封装里指定超时时间。


    霸王
    2010年4月12日 12:01
  • 感觉你使用 多线程比较合适,不知道你的具体需求,给你写了个DEMO.希望对你有帮助

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form4 : Form
        {
            
            public Form4()
            {
                InitializeComponent();
               
            }
            delegate void SetTextCallback(string text);
            private void SetText(string text)
            {
                // InvokeRequired需要比较调用线程ID和创建线程ID
                // 如果它们不相同则返回true
                if (this.label1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.label1.Text = text;
                }
            }
    
            private void SetTextBB(string text)
            {
                // InvokeRequired需要比较调用线程ID和创建线程ID
                // 如果它们不相同则返回true
                if (this.label1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetTextBB);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.label2.Text = text;
                }
            }
         
    
    
            private void button1_Click(object sender, EventArgs e)
            {
           
                System.Threading.Thread t = new Thread(delegate()
                {
                    AA(1);
                });
                t.Start();
    
                System.Threading.Thread t1 = new Thread(delegate()
                {
                    BB(1);
                });
                t1.Start();
    
            }
            private void AA(int a)
            {
                string saa="";
                for (int i = 0; i < 10; i++)
                {
                    saa += "--" + i.ToString();
                    SetText(saa);
                    System.Threading.Thread.Sleep(1000);
                }
           
            }
    
            private void  BB(int B)
            {
                string bbb = "";
                for (int i = 0; i < 10; i++)
                {
                    bbb+= "$" + i.ToString();
                    SetTextBB(bbb);
                    System.Threading.Thread.Sleep(1000);
                }
             
            }
        }
    }
    

    努力+方法=成功
    2010年4月12日 13:04