将每个线程上的多个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();
            }
        }
    }
}

将每个线程上的多个XML文件数据发送到Web服务器

试试这样的方法:对于您输入的每个文件,都会创建一个新线程并上传文件("…"表示代码没有更改)。当然,静态变量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();
        }
    }
}