小弟自学……如果可笑之处,多多包涵。写了一个简单的程序,想用10个线程处理,功能:将List<sting []>中的string []存到10个文本中,List<string []>的长度是10,里面有10个string [],现在问题来了……1、我现在是new了10个线程出来,写了10个方法(因为要保存的文件名不一样,所以写了10个方法),一个线程调用一个方法,请问有更简单的写法吗?下面是我的方法。我是把List<string []>给手动拆了传参
static void Start0(object i)
        {
            string[] s = (string[])i;
            StreamWriter sw = new StreamWriter("d:\\test\\txt0.txt");
            for (int j = 0; j < s.Length; j++)
            {
                    sw.Write(s[j]);
            }
            sw.Close();
        }2、想用一个进度条来监视有没有全部完成,这里需要调用代理什么也都用了,但是进度条不好使,估计是写错了,因为我只用了一个if来判断的……

解决方案 »

  1.   

    问题1:
    所有线程都使用Start(),为了区分不同的线程,需要再添加一个参数。
    这样Start的参数类型改为类,类里面有2个属性string[]和序号。
    问题2:
    可以使用委托的方式在线程结束后将完成数+1。
    在线程中直接设定进度条会出错,此问题可以google[子线程中给控件赋值]
      

  2.   

    第一条:
      传递的Object参数处理方式是多样的
       定义一个Parm类有属性FileName,FileContent;
      int i = 0;
      foreach(string[] item in dataSource)
      {
         Parm parmObject = new Parm{ FileName = "d:\\test\\txt"+i.ToString()+".txt", FileContent =      item};
         Thread tr = new Thread(StartThreadFunction);
         tr.Start(parmObject);
      }static void Start0(object i)
            {
                Parm parmObject = (Parm)i;
                string[] s = parmObject.FileContent;
                StreamWriter sw = new StreamWriter(parmObject.FileName);
                for (int j = 0; j < s.Length; j++)
                {
                        sw.Write(s[j]);
                }
                sw.Close();
            }
      以上是用类型参数来处理,当然用委托更好。
    第二条:
      是不能跨线程访问引用类型对象的,只可以访问值类型,不知道你说的进度条问题是不是这个原因引发的
      

  3.   

    第二条:
    线程中需要一个委托或自定义事件来操作ui线程。或者ui线程访问一个变量,知道完成度之后控制进度条,这需要ui线程有一个timer.
      

  4.   

    Start不是启动线程用的命令吗?每一个线程都有的,委托的方式可以给个简单的例子吗?不太会用。
      

  5.   

    foreach非常陌生,能解释下吗?
      

  6.   

    用一个线程来处理,因为你的是IO操作,不是计算限制的操作。多了只会浪费内存,CPU和时间。你去看看APM编程模型和StreamWriter.BeginWrite方法的使用。
      

  7.   

    一:
                IList<string[]> ArrayList = new List<string[]>();            for (int i = 0; i < 10; i++)
                    ArrayList.Add(new string[] { "a", "s" });            for (int i = 0; i < ArrayList.Count; i++)
                {
                    new Thread(() =>
                    {
                        FileStream fs = new FileStream(string.Format("D:\\test\\txt{0}.txt", i + 1)
                            , FileMode.Create);
                        foreach (string item in ArrayList[i])
                        {
                            Byte[] byteArray = Encoding.UTF8.GetBytes(item);
                            fs.Write(byteArray, 0, byteArray.Length);
                        }
                        fs.Close();
                    }).Start();
                    Thread.Sleep(100);
                }二:
    定义一个变量,每次fs.Cloose()后,进度条等于 100 / ArrayList.Count * Count++
      

  8.   

    foreach非常陌生,能解释下吗?
    我觉得你应该先读完一遍《21天精通C#》在读完大半本《C#高级编程》再来讨论线程的问题,语法都不懂,写什么鬼程序。
      

  9.   

    foreach非常陌生,能解释下吗?
    我觉得你应该先读完一遍《21天精通C#》在读完大半本《C#高级编程》再来讨论线程的问题,语法都不懂,写什么鬼程序。
    你前边建议很好,我也说了是自学,你可以指点我,但是不要指指点点,麻烦你把后面那句吃回去!艹
      

  10.   

    foreach非常陌生,能解释下吗?
    我觉得你应该先读完一遍《21天精通C#》在读完大半本《C#高级编程》再来讨论线程的问题,语法都不懂,写什么鬼程序。
    你前边建议很好,我也说了是自学,你可以指点我,但是不要指指点点,麻烦你把后面那句吃回去!艹
    骚年,还是先去读书吧。需要人给你解释foreach本身会让人轻视。再多的谩骂也都是无知和幼稚的表现。
      

  11.   

    学C#,委托和范型是两个非常重要的东西,建议先学好这些,再来讨论多线程的问题。 你看不懂是因为他们用了Lambda表达式(匿名委托),=〉{...}, foreach这种东西和for循环差不多的,建议边看书边实践,不要跑上来就写。 C#里面还有很多你看不懂的东西,比如LINQ, 脚踏实地慢慢学
      

  12.   

     public class Writefile
        {
            [ThreadStatic]
            private static string _filename;
            [ThreadStatic]
            private static string _context;        public Writefile(string name, string c)
            {
                _filename = name;
                _context = c;        }        public void Writedone()
            {
                using (TextWriter a = new StreamWriter(File.OpenWrite(_filename)))
                {
                    a.Write(_context);
                }
            }    }         private void button1_Click(object sender, EventArgs e)
            {
                progressBar1.Minimum = 1;
                progressBar1.Maximum = 10;
                progressBar1.Value = 1;
                progressBar1.Step = 1;
                progressBar1.Visible = true;
                var enumerable = from ex in "1,2,3,4,5,6,7,8,9,10".Split(',')
                    select
                        new Thread(
                            () =>
                            {
                                new Writefile(@"c:\" + ex, string.Join(",", Enumerable.Repeat(ex, 20000))).Writedone();
                                Thread.Sleep(2000); //just show
                            });            var threads = enumerable as Thread[] ?? enumerable.ToArray();
                foreach (var thread in threads)
                {
                    thread.Start();
                    thread.Join();
                    progressBar1.PerformStep();
                }        }
      

  13.   

    foreach非常陌生,能解释下吗?
    foreach实现的效果和for循环是一样的,只不过它不需要索引器,直接遍历集合中所有的内容。
      

  14.   

    foreach非常陌生,能解释下吗?
    foreach实现的效果和for循环是一样的,只不过它不需要索引器,直接遍历集合中所有的内容。
    感谢你的解答,作为新人,for用的比较多,既然这个跟for的效果一样,那么哪个更快?