c# - WebRequest 挂起用户界面

标签 c# .net multithreading httpwebrequest

我正在使用 WebRequest 执行简单请求,应用程序只是挂起,直到响应返回。我该如何解决这个问题?

看了很多题目,都说要用线程。我不知道如何使用它们;任何人都可以提供以下不挂起用户界面的示例吗?

private string SimpleRequest(String url)
{
    WebRequest request = WebRequest.Create(url);
    WebResponse response = request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    string result = reader.ReadToEnd();
    stream.Dispose();
    reader.Dispose();
    return result;
}

private void button1_Click(object sender, EventArgs e)
{
    String googleHtml = simpleRequest("https://facebook.com");
}

谢谢!

最佳答案

如果你使用的是 c# 5.0,那就太简单了

public async void Test1()
{
      WebClient wc = new WebClient();
      richTextBox1.Text =  await wc.DownloadStringTaskAsync("https://facebook.com");
}

您也可以将您的方法转换为awaitable

private Task<string> simpleRequest(String url)
{
    return Task.Factory.StartNew(() =>
        {
            WebRequest request = WebRequest.Create(url);
            WebResponse response = request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            string result = reader.ReadToEnd();
            stream.Dispose();
            reader.Dispose();
            return result;
        });
}

并调用为

public async void Test2()
{
      richTextBox1.Text =  await simpleRequest("https://facebook.com");
}

对于较低版本的 C#,请参阅其他答案。

关于c# - WebRequest 挂起用户界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131758/

相关文章:

c# - AndAlso 之间有几个 Expression<Func<T, bool>> : referenced from scope

Ruby 多线程 ping 仅当存在多个线程时才会丢失数据包

python - 如何退出正在运行线程的Python程序?

c++ - 联盟中的atomic <>作为性能黑客

c# - 如果动态对象不包含属性,则获取默认值

c# - 即时绘制幅度和频率不断变化的信号类型

c# - 使用 Key = Enums Name 和 Value = Enums value 使用最佳技术创建键值对列表

c# - 如何使 WPF 窗口位于我的应用程序的所有其他窗口之上(不是系统范围的)?

c# - 单元测试,NUnit 还是 Visual Studio?

.net - .NET 的 MongoDB 乐观并发控制