【问题标题】:Sending multiple XML file data on each thread to a webserver将每个线程上的多个 XML 文件数据发送到网络服务器
【发布时间】:2023-04-10 03:23:01
【问题描述】:

首先,我开发了一个简单的 XML 发送器,它将 xml 数据从一个文件发送到一个 Web 服务器,该服务器被编码为一个循环,因此一次只有一个 XML 文件。

现在我想让它成为多线程,这意味着我输入让我们说 XML 文件的 3 个文件名,并为每个文件创建一个线程并并行发送到网络服务器。下面是我当前的实现,我尝试通过在这里和那里添加工作线程来搞乱。编辑* 所以问题是我如何多线程这种类型的程序?

下面是我目前的实现:

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();
            }
        }
    }
}

【问题讨论】:

  • 有什么问题?
  • 主要的想法是我如何多线程这种类型的应用程序,我在上面更新它
  • 那么您在当前实现的多线程空间中尝试过什么?你能展示你遇到的代码、发布错误或问题吗?
  • 我查看了 MSDN c# multithreading reference 上的几个示例,但看到所有不同类型的实现让我感到困惑。在这里也可以使用 async 吗?
  • 其实我可能有个想法,一试就更新代码

标签: c# xml multithreading


【解决方案1】:

尝试如下操作:对于您输入的每个文件,都会创建一个新线程并上传文件(“...”表示未更改的代码)。当然,静态变量 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();
        }
    }
}

【讨论】:

  • 我检查一下,我会回复你。
  • 我强烈建议您查看 Task,或者通过线程类进行异步和等待,线程不是轻量级对象,对于这个应用程序似乎正在执行的负载,我相信 Task 会更适合。 Slaks 在blog.slaks.net/2013-10-11/threads-vs-tasks 上有一篇不错的博文
  • 这更多是对正确方向的提示,但我会查看此资源,看看我能比目前更好地提出什么
  • 我删除了以前的 cmets,因为在复制代码时出现了一个小错误,所以我运行了允许我输入 url 然后输入 xml 文件的代码,但它立即发送到网络服务器而不是写入所有文件,然后将它们全部发送出去。
  • 所以想法是输入多个文件并等到“”被按下并同时发送所有文件?所以我想线程连接将是这里的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多