1: Может ли кто-нибудь объяснить мне последнюю строку первой функции?

2: Вторая функция не работает. Скажите, пожалуйста, почему. PHP-скрипт получает данные.

Я отредактировал код, чтобы получить это, но теперь приложение вылетает из-за System nullreferenceexception. Пожалуйста помоги.

    private void checkbutton_Click(object sender, RoutedEventArgs e)
    {
        statustext.Text = "Checking for new score";
        var webclient = new WebClient();
        webclient.OpenReadCompleted += new OpenReadCompletedEventHandler(getscores_OpenReadCompleted);
        webclient.OpenReadAsync(new Uri("http://example.com/get.php?"+DateTime.Now));


    }
    void getscores_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        StreamReader s = null;
        Stream reply=null;
        try
        {

               reply = (Stream)e.Result;
                 s = new StreamReader(reply);                  

            }

        catch 
        {
            statustext.Text = "ERROR IN FETCHING";
        }
        scorebox.Text = s.ReadToEnd();
        statustext.Text = "DoNE";

    }
0
Atul Goel 16 Дек 2014 в 19:35
2
Это одна из тех областей, где вы можете использовать Отладчик, чтобы проверить и увидеть, соответствует ли statustext. Текст на самом деле устанавливается, или если есть какая-то другая проблема с привязкой
 – 
Sam I am says Reinstate Monica
16 Дек 2014 в 19:37
7
Вам следует попробовать переместить регистрацию делегата над вызовом на OpenReadAsync
 – 
xDaevax
16 Дек 2014 в 19:38
1
В дополнение к тому, что сказал xDaevax (поскольку в противном случае OpenReadCompleted может быть запущен до того, как вы зарегистрируете свой обработчик), вы также должны отправить getscores_OpenReadCompleted в поток пользовательского интерфейса. Установка свойства Text из другого потока не допускается.
 – 
Adriano Repetti
16 Дек 2014 в 19:39
Точный код в учебнике, казалось, работал хорошо, но он вообще ничего не отображает. На самом деле, я не думаю, что вторая функция вообще выполняется.
 – 
Atul Goel
16 Дек 2014 в 19:41

2 ответа

Лучший ответ

Здесь есть пара проблем:

  1. Зарегистрируйте делегата перед вызовом на OpenReadAsync
  2. Прочтите поток из аргументов события и закройте поток, когда закончите.

private void checkbutton_Click(object sender, RoutedEventArgs e)
{
    statustext.Text = "Checking for new score";
    var webclient = new WebClient();
    webclient.OpenReadCompleted += new OpenReadCompletedEventHandler(getscores_OpenReadCompleted);
    webclient.OpenReadAsync(new Uri("http://example.com/get.php?"+DateTime.Now));

}
void getscores_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    Stream reply = null;
    StreamReader s = null;
    string outputText = string.Empty;
    try
    {
        reply = (Stream)e.Result;
        s = new StreamReader(reply);
        outputText = s.ReadToEnd();
    }
    finally
    {
        if (s != null)
        {
            s.Close();
        }

        if (reply != null)
        {
            reply.Close();
        }
    }
    statustext.Text = outputText;

}

См. Использование метода OpenReadAsync здесь:

0
xDaevax 16 Дек 2014 в 19:44
Привет! Можете ли вы помочь мне с простым приложением для чтения данных из базы данных SQL и их отображения.
 – 
Atul Goel
16 Дек 2014 в 21:05

Последняя строка первого метода присоединяет обработчик к событию. Это говорит о том, что когда срабатывает событие OpenReadCompleted, то есть когда чтение завершается, должен быть вызван метод getscores_OpenReadCompleted.

getscores_OpenReadCompleted не работает, потому что он пытается получить доступ к элементу пользовательского интерфейса из потока, не относящегося к пользовательскому интерфейсу.

Вы также добавляете обработчик после запуска асинхронной операции, поэтому, хотя это маловероятно, вполне возможно, что операция завершится очень быстро, и событие будет запущено до того, как вы добавите обработчик. Хотя такая ситуация была бы очень необычной, ее можно исправить очень быстро и легко, просто добавив обработчик перед запуском асинхронной операции.

6
Servy 16 Дек 2014 в 19:44