小弟自学……如果可笑之处,多多包涵。写了一个简单的程序,想用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来判断的……
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来判断的……
解决方案 »
- asp.net如何获取android上传的图片【很愁,一直搞不定】
- 求大神、小神帮忙!
- 请教:c#中导入word模板的路径问题
- C# 串口通信问题
- 100分,求一个事关C#性能的编程问题.
- C#.net 2005 WEB开发遇到的模板字段事件不响应的问题。有分捉虫。
- 水晶报表的入门问题,抢分哈
- process1.StartInfo.FileName = "NotePad.exe";这里没知道程序路径,为何能调的出来?
- 怎么让程序窗口总是顶层窗口?
- c#开发带数据库的PDA上用的软件
- c#初学,调用c的dll
- DataSet里添加数据库里的时间类型时弹出"该字符串未被识别为有效的 DateTime"
所有线程都使用Start(),为了区分不同的线程,需要再添加一个参数。
这样Start的参数类型改为类,类里面有2个属性string[]和序号。
问题2:
可以使用委托的方式在线程结束后将完成数+1。
在线程中直接设定进度条会出错,此问题可以google[子线程中给控件赋值]
传递的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();
}
以上是用类型参数来处理,当然用委托更好。
第二条:
是不能跨线程访问引用类型对象的,只可以访问值类型,不知道你说的进度条问题是不是这个原因引发的
线程中需要一个委托或自定义事件来操作ui线程。或者ui线程访问一个变量,知道完成度之后控制进度条,这需要ui线程有一个timer.
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++
我觉得你应该先读完一遍《21天精通C#》在读完大半本《C#高级编程》再来讨论线程的问题,语法都不懂,写什么鬼程序。
我觉得你应该先读完一遍《21天精通C#》在读完大半本《C#高级编程》再来讨论线程的问题,语法都不懂,写什么鬼程序。
你前边建议很好,我也说了是自学,你可以指点我,但是不要指指点点,麻烦你把后面那句吃回去!艹
我觉得你应该先读完一遍《21天精通C#》在读完大半本《C#高级编程》再来讨论线程的问题,语法都不懂,写什么鬼程序。
你前边建议很好,我也说了是自学,你可以指点我,但是不要指指点点,麻烦你把后面那句吃回去!艹
骚年,还是先去读书吧。需要人给你解释foreach本身会让人轻视。再多的谩骂也都是无知和幼稚的表现。
{
[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();
} }
foreach实现的效果和for循环是一样的,只不过它不需要索引器,直接遍历集合中所有的内容。
foreach实现的效果和for循环是一样的,只不过它不需要索引器,直接遍历集合中所有的内容。
感谢你的解答,作为新人,for用的比较多,既然这个跟for的效果一样,那么哪个更快?