2009-11-18 4 views
1

Хорошо, я пытаюсь сравнить две строки каждые 15 секунд, а затем обновить информационное окно.Сравнение строк в C#

Вот код, который я до сих пор, чтобы получить текстовый документ из Интернета и хранить его в строку:

public String GetData(String url) 
{ 
    WebRequest request = WebRequest.Create(url); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    String data = reader.ReadToEnd(); 
    reader.Close(); 
    dataStream.Close(); 
    response.Close(); 
    return data; 
} 

А вот то, что я с попыткой сравнить строки.

public void CompareStrings() 
{ 
    int x; 
    x = 1; 
    String data = GetData("http://xcastradio.com/stats/nowplaying.txt"); 
    string savedData = data; 
    while (x > 0 && x < 100000001) 
    { 
     x++; 
    } 
    String data1 = GetData("http://xcastradio.com/stats/nowplaying.txt"); 
    NowPlayingInfo1.Text = data; 
    NowPlaying np = new NowPlaying(); 
    if (data1 != savedData) 
    { 
     NowPlayingInfo1.Text = data1; 
     np.Show(this); 
    } 
} 
+7

И что вы думаете? –

+0

Моя ставка, вопрос: «Почему« сравнивать »не работают соответственно?» –

+1

... но есть еще немало вопросов, ожидающих ответа;) – spender

ответ

3

Я думаю, что ваши CompareStrings() метод должен быть чем-то вроде этого:

private bool _Comparing = false; 
private string _URL = "http://xcastradio.com/stats/nowplaying.txt"; 
private string _data = ""; 
public void CompareStrings() 
{ 
    Timer timer = new Timer(); 
    timer.Interval = 1000; 
    timer.Tick += timer_Tick; 
    _data = GetData(_URL); 
    _Comparing = true; 
    timer.Start(); 
} 
void timer_Tick(object sender, EventArgs e) 
{ 
    if (_Comparing) 
    { 
     string newdata = GetData(_URL); 
     if (newdata != _data) 
     { 
      NowPlaying np = new NowPlaying(); 
      NowPlayingInfo1.Text = newdata; 
      _data = newdata; 
      np.Show(this); 
     } 
    } 
    else 
    { 
     Timer timer = (Timer)sender; 
     timer.Stop(); 
    } 
} 

Этот код использует Timer для проверки URL один раз в секунду. Всякий раз, когда содержимое этого текстового файла изменяется, в этом коде появляется новое окно NowPlaying (это то, что, как я думаю, вы пытаетесь сделать), и будет продолжать делать это до тех пор, пока вы не установите в false.

Вы также можете опросить URL-адрес менее часто, чем один раз в секунду, и в этом случае вы должны установить timer.Interval примерно на 10000 (10 секунд).

+0

System.Windows.Forms.Timer используется в WinForms ... он делает Web. – balexandre

+0

@balexandre: насколько я могу судить, он пишет приложение winforms, которое обращается к веб-ресурсу. Ключевой линией в его исходном коде является 'np.Show (this);' который является методом, используемым для отображения 'Form'. – MusiGenesis

1
public void CompareStrings() 
    { 
     String data = GetData("http://xcastradio.com/stats/nowplaying.txt"); 

     System.Threading.Thread.Sleep(TimeSpan.FromSeconds(15)); 

     String data1 = GetData("http://xcastradio.com/stats/nowplaying.txt"); 

     NowPlayingInfo1.Text = data; 

     NowPlaying np = new NowPlaying(); 

     if (String.Compare(data, data1) != 0) 
     { 
      NowPlayingInfo1.Text = data1; 
      np.Show(this); 
     } 

    } 

Эта нить, чтобы проверить эту песню в настоящее время играет должна быть отделена от основной поток приложения, так как он спит, и вы хотите (я думаю) для вашего приложения, чтобы держать в ответ даже между проверками.

Редактировать: Сравнить теперь должно работать правильно (не проверено).

6

Я не хочу быть, но то, что элегантной цель:

while (x > 0 && x < 100000001) 
    { 
     x++; 
    } 

Если вы хотите паузу, почему не только Thread.sleep (TimeSpan.FromSeconds (1))? Ваш образец кода не имеет особого смысла.

+0

@David: Точно, хотя ничто не сравнивается со сравнением строк, цикл с задержкой - это один разработчиков «Нет-нет». –

+0

@okw: использование 'Thread.Sleep (n)' для задержки почти такое же, как no-no, как цикл (хотя, по крайней мере, он не вызывает зависящую от процессора продолжительность). – MusiGenesis

+0

Я был в автономном режиме и не мог понять, как остановить его с интервалом. Таким образом, подсчет моего компьютера состоял в том, чтобы увидеть, будет ли то, что я написал, работать, как я хотел этого в то время. – Cistoran

0

Я рекомендую вам вместо этого, использовать следующее:

  1. Генерация хэш сохраненных данных и сохранения значения, вам не нужно создавать большие строковые объекты, если вам не нужно на самом деле. ..
  2. Для всех новых чтений просто создайте хэш и сравните его с сохраненным хэш-объектом.
  3. Используйте любой алгоритм хеширования, но я бы рекомендовал использовать shah1.
  4. Используйте метод String.Compare (...) класса String для сравнения хэш-объектов.
  5. Попробуйте Thread.Sleep ([millisecondsvaluehere]), чтобы приостановить выполнение программы. Вы также можете рассмотреть вопрос о включении запроса на чтение в таймер, формы или системный таймер (обязательно перед вызовом объектов пользовательского интерфейса)