2017-02-06 5 views
0

私たちはこれを持っていますURL 接続が閉じず、無期限に1秒ごとに応答を送信し続けます。C#で継続的に応答するWebページからデータ(部分)を取得する方法は?

私の現在のコードでは、データを表示する前に接続が終了するまで待っていますが、このWebページが無期限に応答するため、書いたプログラムも無期限に待機します。

しかし、すぐに接続を閉じるwww.google.comなどの他のテストURLでは、正常に動作します。

public partial class Form2 : Form 
{ 
    string testurl = "https://live.wh.sportingpulseinternational.com/v1/basketball/read/448426?ak=6eea426648c256cae71a9409352304fe&types=scoreboard,status,boxscore&format=json"; 

    WebClient wc = new WebClient(); 
    public Form2() 
    { 
     InitializeComponent(); 

     wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(DownloadComplete); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     wc.DownloadDataAsync(new Uri(testurl)); 
     button1.Enabled = false; 
    } 

    private void DownloadComplete(object sender, DownloadDataCompletedEventArgs args) 
    { 
     byte[] result = args.Result; 
     richTextBox1.Text += System.Text.Encoding.Default.GetString(result); 
     button1.Enabled = true; 
    } 
} 

あなたがさらに明確化を持っている場合は、お尋ねください。

は、ここに私のコードです。

ANSWERのUPDATE おかげレベントに、私がやったことは、このようなものです。ここで

私の問題への完全な答えである:このコードは、メッセージを読ん

string testurl = "https://live.wh.sportingpulseinternational.com/v1/basketball/read/448426?ak=6eea426648c256cae71a9409352304fe&types=scoreboard,status,boxscore&format=json"; 
    BackgroundWorker worker = new BackgroundWorker(); 

    public Form2() 
    { 
     InitializeComponent(); 

     worker.WorkerSupportsCancellation = true; 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     SetEnabled(button1, false); 
     worker.RunWorkerAsync(); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     string url = testurl; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     using (WebResponse response = request.GetResponse()) 
     { 
      using (StreamReader rdr = new StreamReader(response.GetResponseStream())) 
      { 
       try 
       { 
        while (!rdr.EndOfStream) 
        { 
         var str = rdr.ReadLine(); 
         SetText(richTextBox1, str); 
        } 
       } 
       catch (Exception) 
       { 

       } 
      } 
     } 
     worker.CancelAsync(); 
     SetEnabled(button1, true); 
    } 

    delegate void SetEnabledCallback(Button target, bool value); 
    private void SetEnabled(Button target, bool value) 
    { 
     if (target.InvokeRequired) 
     { 
      SetEnabledCallback d = new SetEnabledCallback(SetEnabled); 
      this.Invoke(d, new object[] { target, value }); 
     } 
     else 
     { 
      target.Enabled = value; 
     } 
    } 

    delegate void SetTextCallback(dynamic target, string text); 
    private void SetText(dynamic target, string text) 
    { 
     if (target.InvokeRequired) 
     { 
      SetTextCallback d = new SetTextCallback(SetText); 
      this.Invoke(d, new object[] { target, text }); 
     } 
     else 
     { 
      target.Text += text; 
     } 
    } 

答えて

1

、あなたはasycn操作でそれを実行することができます。

  string url = "https://live.wh.sportingpulseinternational.com/v1/basketball/read/448426?ak=6eea426648c256cae71a9409352304fe&types=scoreboard,status,boxscore&format=json%22link%22"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     using(WebResponse response = request.GetResponse()) 
     { 
      using(StreamReader rdr = new StreamReader(response.GetResponseStream())){ 
       while(!rdr.EndOfStream){ 
        var str = rdr.ReadLine(); 
        Console.WriteLine(str); 
       } 
      } 
     } 
+0

ありがとう、これは私の問題を解決するのに役立ちました。 – jestrange

関連する問題