获取数据时 GUI 没有响应
我的应用程序经常使用 WebRequest 从网页获取数据,但在获取数据时无法单击按钮等。 我知道我必须使用线程/后台工作者,但我无法让它正常工作; 它不会使 GUI 更具响应性。
我想在代码上应用某种线程,以便它停止使我的应用程序无响应:
public string SQLGet(string query)
{
string post = "q=" + query;
WebRequest request = WebRequest.Create("http://test.com");
request.Timeout = 20000;
request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(post);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
requestStream = response.GetResponseStream();
StreamReader reader = new StreamReader(requestStream);
string ret = reader.ReadToEnd();
reader.Close();
requestStream.Close();
response.Close();
return ret;
}
编辑:谢谢你,lc,我尝试过与此非常相似的东西。 但我这样使用后台工作者的问题是; 如何将 queryResult 返回到调用(在我的情况下是 SQLGet,在您的情况下)StartQuery 的函数?
在我的示例中,返回的字符串将用作内部调用字符串的 void 中的局部变量。
而且可能同时有很多查询,所以我不想冒险将其分配给全局变量。
My application often fetch data from a webpage using WebRequest, but it isn't possible to click buttons etc while it's fetching. I've understood that I have to use threads/a backgroundworker, but I can't get it to work properly; it doesn't make the GUI more respondable.
The code I want to apply some kind of threading on, so that it stops making my application unresponding:
public string SQLGet(string query)
{
string post = "q=" + query;
WebRequest request = WebRequest.Create("http://test.com");
request.Timeout = 20000;
request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(post);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
requestStream = response.GetResponseStream();
StreamReader reader = new StreamReader(requestStream);
string ret = reader.ReadToEnd();
reader.Close();
requestStream.Close();
response.Close();
return ret;
}
Edit: Thank you, lc, I had tried something pretty similar to that. But my problem with using the backgroundworker like that is; how do I get the queryResult back to the function which called (in my case SQLGet, and in your case) StartQuery?
In my example, the returned string is going to be used as a local variable in the void the string is called inside.
And there may be many queries at the same time, so I don't want to risk assigning it to a global variable.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
以下是如何使用
BackgroundWorker< 的简单示例/code>
,因为它适用于您的代码:
您可能还希望允许取消、提供错误详细信息或在获取数据时提供可靠的反馈。 查看MSDN 页面上的示例更多细节。
查询结果将在
BackgroundWorker.RunWorkerCompleted
事件中显示为e.Result
(在本例中,我将其存储为实例变量)。 如果您要同时运行其中许多查询,则需要一种方法来区分哪个查询。 因此,您应该向该方法传递的不仅仅是一个字符串。 举个例子:Here's a simple example of how to use the
BackgroundWorker
as it applies to your code:You may also wish to allow cancellation, provide error details, or provide robust feedback as it fetches data. Take a look at the example on the MSDN page for more details.
The result of your query will show up in the
BackgroundWorker.RunWorkerCompleted
event ase.Result
(I've stored it as an instance variable in this case). If you're going to run many of these at the same time, you'll need a way to differentiate which query is which. So you should pass more than just a string to the method. Take this example:BackgroundWorker 是一个很好的解决方案,具有一些对取消和进度的内置支持。 您还可以仅使用 HttpWebRequest.BeginGetResponse 而不是 GetResponse 来启动异步 Web 请求操作。 这最终非常简单,您可以设置进度回调。
有关您尝试执行的操作的确切示例,请参阅:
使用 HttpWebRequest 进行异步下载
BackgroundWorker is a good solution, with some built-in support for cancellation and progress. You can also just use HttpWebRequest.BeginGetResponse, rather than GetResponse, to initiate an asynchronous web request operation. This ends up being quite simple and you can set up a progress callback.
For an exact example of what you're trying to do, see:
Using HttpWebRequest for Asynchronous Downloads
这是一个快速解决方案,应该很容易从中获取您需要的内容。
Here is a quick solution, should be easy to take what you need from it.