将每个线程上的多个XML文件数据发送到Web服务器
本文关键字:数据 Web 服务器 文件 XML 线程 | 更新日期: 2023-09-27 17:59:47
首先,我开发了一个简单的XML发送器,它将XML数据从文件发送到web服务器,该服务器被编码为循环,因此一次只能发送一个XML文件。
现在,我想让它成为多线程的,这意味着我输入3个XML文件的文件名,为每个文件创建一个线程,并并行发送到Web服务器。下面是我目前的实现,我试着到处添加工作线程。编辑*所以问题是我如何阅读这种类型的程序?
以下是我目前的实现:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
namespace XMLSender
{
class Program
{
private static string serverUrl;
static void Main(string[] args)
{
Console.WriteLine("Please enter the URL to send the XML File");
serverUrl = Console.ReadLine();
List<Thread> threads = new List<Thread>();
string fileName = "";
do
{
Console.WriteLine("Please enter the XML File you Wish to send");
Thread t = new Thread(new ParameterizedThreadStart(send));
t.Start(fileName = Console.ReadLine());
threads.Add(t);
}
while (fileName != "start"); //Ends if user enters an empty line
foreach (Thread t in threads)
{
t.Join();
}
}
static private void send(object data)
{
try
{
//ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverUrl);
byte[] bytes;
//Load XML data from document
XmlDocument doc = new XmlDocument();
doc.Load((string)data);
string xmlcontents = doc.InnerXml;
//Send XML data to Webserver
bytes = Encoding.ASCII.GetBytes(xmlcontents);
request.ContentType = "text/xml; encoding='utf-8'";
request.ContentLength = bytes.Length;
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
// Get response from Webserver
HttpWebResponse response;
response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
string responseStr = new StreamReader(responseStream).ReadToEnd();
Console.Write(responseStr + Environment.NewLine);
}
catch (Exception e)
{
Console.WriteLine("An Error Occured" + Environment.NewLine + e);
Console.ReadLine();
}
}
}
}
试试这样的方法:对于您输入的每个文件,都会创建一个新线程并上传文件("…"表示代码没有更改)。当然,静态变量serverUrl不是一个好方法,但它在这里起到了作用。所使用的方法也可以是非静态的。您可以使用任何方式退出创建线程的循环,在这种情况下,用户必须输入空行
要等到所有线程都完成,请使用Thread.Join()之类的符号,并将所有创建的线程存储在列表中
List<Thread> threads = new List<Threads>();
...
threads.add(new Thread(...));
...
foreach (Thread t in threads) t.Join();
此处更改的代码
class Program
{
private static string serverUrl;
static void Main(string[] args)
{
Console.WriteLine("Please enter the URL to send the XML File");
serverUrl = Console.ReadLine();
string fileName = "";
do
{
Console.WriteLine("Please enter the XML File you Wish to send");
Thread t = new Thread(new ParameterizedThreadStart(send));
fileName = Console.ReadLine();
if(fileName != "")
t.Start();
}
while (fileName != ""); //Ends if user enters an empty line
}
static private void send(object url)
{
try
{
//ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverUrl);
byte[] bytes;
//Load XML data from document
XmlDocument doc = new XmlDocument();
doc.Load((string)url);
string xmlcontents = doc.InnerXml;
...
Console.Write(responseStr + Environment.NewLine);
}
catch (Exception e)
{
Console.WriteLine("An Error Occured" + Environment.NewLine + e);
Console.ReadLine();
}
}
}