2012-01-12 15 views
4

いくつかの条件が満たされるまで、WebページをリフレッシュするC#の小さなアプリケーションを開発中です。私は "火" =ボタンを爽やかに開始し、 "停止!"ボタンをクリックして操作を停止します。私の問題は、1の代わりにストップボタンを2回押してみることです。以下は私のコードです:私のボタンは1回ではなく2回クリックする必要があります

タイマーでコードを更新しました。まだ私は、タイマのいくつかのより良い使用することができると思う、私は最初の2-3のリフレッシュ後、または毎回更新されない毎秒更新しないと思う。私のコードに、私が検出できない欠陥がありますか?

private void FireButtonClick(object sender, EventArgs e) 
{ 

    try 
    { 
     if (webBrowser1.Url.ToString().StartsWith("some url")) 
     { 
      _stopped = false; 
      _timer.Tick += new EventHandler(RefreshBrowser); 
      _timer.Interval = (1000) * (1); 
      _timer.Enabled = true; 
      _timer.Start(); 
     } 
     else 
     { 
      MessageBox.Show("You must logon first."); 
      return; 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

private void RefreshBrowser(object sender, EventArgs e) 
{ 
    string content = "disabled"; 
    string baseUrl = @"http://some url"; 
    string newUrl = string.Empty; 
    string buttonXpath = @"/html/body/div/div[6]/table/tr/td[2]/table/tr/td/table/tr/td/table/tr[3]/td[2]/div[4]/a"; 
    webBrowser1.Refresh(); 
    _proceed = false; 
    if (!content.ToLower().Equals("disabled") && !_stopped) 
    { 

     if (!_stopped) 
     { 
      HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument(); 
      htmlDocument.LoadHtml(webBrowser1.DocumentText); 
      HtmlNode node = htmlDocument.DocumentNode.SelectSingleNode(buttonXpath); 
      content = node.GetAttributeValue("disabled", string.Empty); 
      newUrl = node.GetAttributeValue("href", string.Empty); 
     } 
    } 
    else 
    { 

     webBrowser1.Navigate(baseUrl + newUrl); 
    } 


} 

private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) 
{ 
    _proceed = true; 
    urlTextBox.Text = webBrowser1.Url.ToString(); 
} 

private void MainPageButtonClick(object sender, EventArgs e) 
{ 
    try 
    { 
     webBrowser1.Navigate(_mainPage); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

private void GoButtonClick(object sender, EventArgs e) 
{ 
    try 
    { 
     webBrowser1.Navigate(urlTextBox.Text); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

} 

private void StopButtonClick(object sender, EventArgs e) 
{ 
    _timer.Stop(); 
    _proceed = true; 
    _stopped = true; 
} 

}

答えて

3

あなたは本当に、タイマーを使用するようにコードを変更する必要があります。 GUIスレッドを誤用してApplication.DoEvents();への定期的な呼び出しを行うと、クリックはその場所でしか処理できず、イベントを処理するためにループに入る必要があります。

これは絶対的なGUIプログラミングではありません。代わりにタイマーを使用してください。

Hereは、タイマーを使用して定期的にメソッドを呼び出す方法の例です。あなたの場合、ページのリフレッシュを実行する。

+0

私は自分の質問をいくつかの 'Timer'コードで編集しました。 – iCantSeeSharp

+0

私は100%確信していませんが、時々ロードされる前にページがリフレッシュされていると思います。 – iCantSeeSharp

+0

はい、あなたは正しいです、 'RefreshBrowser'メソッドの一番下に' Refresh'へ呼び出しを移動してください。 'Navigate'の後に呼び出さなければなりません – jdehaan

0

私の推測では、あなたがForループに詰まっていて、そのループが完了するまで停止できないと思います。これが2つのクリックを必要としているように見える理由です。実際は停止するのを待っています。

ウェブページを更新し、実行ボタンをクリックしてthread.run()を呼び出し、停止ボタンをクリックしてthread.stop()を呼び出してください。 Webページのリフレッシュは別のスレッドで行われるため、UIのやりとりを妨げることはありません。

2

これは、同じスレッド内のすべてを実行しているため、コードが実行されているときにUIの操作はできません(=最初のクリック)、ページの読み込み中にUIの操作が可能(=クリック)。それが問題ならば、別のスレッドでリフレッシュロジックを実行してください。

ような何か:

private void FireButtonClick(object sender, EventArgs e) 
{ 
    Thread worker = new Thread(new ThreadStart(delegate() 
    { 
     //your code 
    }); 
    worker.IsBackground = true; //so it does not block the app from being closed 
    worker.Start(); 
} 

をあなたはまたInvokeを使用する必要があるスレッドでUI要素にアクセスする場合は!

+3

これは私の意見では、初心者にとっては面倒すぎるので、タイマーはGUIエレメントを直接呼び出すことができます(GUI上で呼び出されます)。繰り返しタスクを実行するためにスリープとループが必要です。基本的には、タイマーをコード化する必要があります:-) – jdehaan

+0

@jdehaan:x秒ごとにrefrehsを実行したいだけなら、私は同意しますが、質問と例を読んで連続的に行います。とにかくそれは多くのリソースを使用していないとユーザーのexpirienceは同じでなければならないので、それはとにかくタイマーで良いだろう... – ChrFin

関連する問題