首先,总的来说,我对 C# 和 .NET Framework 还是很陌生,但我想要实现的是一个(恕我直言)简单的目标,但我仍然遇到了一些麻烦。
我的目标是使用WebRequest
该类将数据发布到 Web 服务。我已经阅读了文档和示例,尤其是这一部分:
BeginGetRequestStream 方法需要在此方法变为异步之前完成一些同步设置任务(例如 DNS 解析、代理检测和 TCP 套接字连接)。因此,永远不应在用户界面 (UI) 线程上调用此方法,因为它可能需要一些时间,通常是几秒钟。
参考链接的示例,如何制作方法GetRequestStreamCallback
并GetResponseCallback
在后台线程中运行?
这是我到目前为止得到的:
private void startTask()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerAsync();
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
updateStatus(e.ProgressPercentage);
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
postData = /* data to be posted */;
byte[] postBytes = Encoding.UTF8.GetBytes(postData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com");
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
request.Method = "POST";
request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
}
private void GetRequestStreamCallback(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
using (Stream stream = request.EndGetRequestStream(result))
{
stream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetBytes(postData).Length);
stream.Close();
}
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}
private void GetResponseCallback(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
Console.WriteLine(response.StatusDescription);
}
我使用 a 的原因BackgroundWorker
是为了与 UI 交互,但我愿意接受其他解决方案。我的问题是:当执行流程到达worker_DoWork
函数末尾时,worker 会终止吗?或者甚至回调函数都是由worker自己执行的?如果没有,是否有另一种方法可以让整个代码在单独的线程中运行?
对于这个(可能)愚蠢的问题,我深表歉意,但正如我所说,我对 .NET 还是很陌生,我仍然不了解线程和线程池的概念。