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";
}
2 ответа
Здесь есть пара проблем:
- Зарегистрируйте делегата перед вызовом на
OpenReadAsync
- Прочтите поток из аргументов события и закройте поток, когда закончите.
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
здесь:
- http://msdn.microsoft. com / en-us / library / system.net.openreadcompletedeventhandler (v = vs.110) .aspx и здесь
- http://msdn.microsoft.com/en-us/library/ms144211(v=vs.110).aspx
Последняя строка первого метода присоединяет обработчик к событию. Это говорит о том, что когда срабатывает событие OpenReadCompleted
, то есть когда чтение завершается, должен быть вызван метод getscores_OpenReadCompleted
.
getscores_OpenReadCompleted
не работает, потому что он пытается получить доступ к элементу пользовательского интерфейса из потока, не относящегося к пользовательскому интерфейсу.
Вы также добавляете обработчик после запуска асинхронной операции, поэтому, хотя это маловероятно, вполне возможно, что операция завершится очень быстро, и событие будет запущено до того, как вы добавите обработчик. Хотя такая ситуация была бы очень необычной, ее можно исправить очень быстро и легко, просто добавив обработчик перед запуском асинхронной операции.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
OpenReadAsync