C# AsyncHttpWebRequest(网页标题检索程序)

C# AsyncHttpWebRequest(网页标题检索程序),c#,asynchronous,httpwebrequest,C#,Asynchronous,Httpwebrequest,我正在尝试创建一个程序,该程序将检索给定url的页面标题。我编写的代码在不使用AsyncCallback时可以工作,但在使用AsyncCallback时,代码似乎不工作 public void GetWebPageTitle(string URL) { // make request for web page HttpWebRequest myWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL); myWebReq

我正在尝试创建一个程序,该程序将检索给定url的页面标题。我编写的代码在不使用AsyncCallback时可以工作,但在使用AsyncCallback时,代码似乎不工作

public void GetWebPageTitle(string URL)
{
    // make request for web page
    HttpWebRequest myWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
    myWebRequest.Method = "GET";
    myWebRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), myWebRequest);
    zConsole.WriteLine("Beginning HttpWebRequest for: " + URL);
}

void FinishWebRequest(IAsyncResult result)
{
    zConsole.WriteLine("...");
    string title = "Unknown";

    //Code under here doesnt get extcuted

    HttpWebResponse myWebResponse = (HttpWebResponse)((HttpWebRequest)result.AsyncState).EndGetResponse(result);
    StreamReader myWebSource = new StreamReader(myWebResponse.GetResponseStream());
    string source = "";            
    source = myWebSource.ReadToEnd();
    myWebResponse.Close();
    title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;
    zConsole.WriteLine(title);
}
public void getWebPagetTitle(字符串URL)
{
//请求网页
HttpWebRequest myWebRequest=(HttpWebRequest)HttpWebRequest.Create(URL);
myWebRequest.Method=“GET”;
BeginGetResponse(新的异步回调(FinishWebRequest),myWebRequest);
WriteLine(“为:+URL开始HttpWebRequest”);
}
作废FinishWebRequest(IAsyncResult结果)
{
zConsole.WriteLine(“…”);
字符串title=“未知”;
//此处下方的代码不会被删除
HttpWebResponse myWebResponse=(HttpWebResponse)((HttpWebRequest)result.AsyncState).EndGetResponse(result);
StreamReader myWebSource=新的StreamReader(myWebResponse.GetResponseStream());
字符串源=”;
source=myWebSource.ReadToEnd();
myWebResponse.Close();
title=Regex.Match(source,@“\]*\>\s*(?[\s\s]*?)\”,RegexOptions.IgnoreCase).Groups[“title”].Value;
zConsole.WriteLine(标题);
}

谢谢。

我认为,问题是,您的程序在返回异步结果之前结束。 执行Console.Writeline后的主线程死亡


剩下的看起来没问题。BeginGetResponse at

在回调中的代码周围放置一个try/catch块,查看其中是否有任何内容引发异常


否则,更多的细节将是有用的。当您说代码没有被执行时,您实际上是在单步执行代码/使用断点,还是根据控制台输出假设情况如此?这个请求是从应用程序的主窗口线程发出的吗?

什么是“代码似乎不工作”的意思?是否调用过
FinishWebRequest
方法?它写的标题是空的吗?@jimMischel在测试了我的程序之后,我意识到FinishWebRequest方法从未被调用过(我之前感到困惑,因为VS在FinishWebRequest方法中的断点处停止)。正如您所知,我对异步和线程非常陌生。@zaza The good接近FinishWebRequest方法的标准示例。用于提取标题的正则表达式看起来也不错。你能指定你得到的错误吗?也许会在你的答案中添加输出/错误?@Abbas问题是FinishWebRequest方法永远不会被调用,我有点困惑。如果Visual Studio在
FinishWebRequest
方法中的断点处停止,则必须调用该方法。也就是说,您可以考虑使用<代码> WebClient <代码>类和<代码> DownloadStringAsync < /代码>。它使用面向事件的接口,比HttpWebRequest更易于使用。有关示例,请参见。