为什么不委托调用函数

本文关键字:函数 调用 为什么不 | 更新日期: 2023-09-27 18:34:20

1:有人可以向我解释第一个函数的最后一行吗?

2:第二个功能不起作用。请告诉我为什么。PHP 脚本正在获取数据。

我编辑了代码来获取它,但该应用程序现在崩溃并显示系统空引用异常。请帮忙。

    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";
    }

为什么不委托调用函数

第一个方法的最后一行是将处理程序附加到事件。 它的意思是,当OpenReadCompleted事件触发时,也就是说,当读取完成时,应该调用getscores_OpenReadCompleted方法。

getscores_OpenReadCompleted不起作用,因为它尝试从非 UI 线程访问 UI 元素。

您还将在启动异步操作后添加处理程序,因此虽然不太可能,但操作肯定有可能在添加处理程序之前快速完成并且触发事件。 虽然这种情况非常不常见,但只需在开始异步操作之前添加处理程序即可非常快速轻松地修复它。

这里有几个问题:

  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方法的用法:

  • http://msdn.microsoft.com/en-us/library/system.net.openreadcompleteeventhandler(v=vs.110).aspx和这里
  • http://msdn.microsoft.com/en-us/library/ms144211(v=vs.110).aspx