多线程调用共用方法的问题

startray 2009-04-21 04:12:07
我的想法是这样的,循环启用多个线程,然后各干各的工作.各自结束就结束,互不干涉,但里面有些方法是可以互用的,现在出现了调用方法时总出现数据乱七八糟的,想来估计是线程互相调用时乱啦.请各位指教一下.多线程是肯定的,是同时启动的,同时启动多个线程,每个线程干自个的事,功能互不干涉.
代码如下:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i <2; i++)
{
string aa = "";
string bb = "";

if (i == 0)
{
aa = "E:\\bak\\a\\test.xml";
bb = "E:\\bak\\c\\a.xml";
}
else if (i == 1)
{
aa = "E:\\bak\\b\\新建 文本文档.txt";
bb = "E:\\bak\\d\\wy.txt";
}

Thread t = new Thread(new ThreadStart(delegate() { copyfile(aa, bb,i); }));
t.Start();
}
}
private void copyfile( string path1,string path2 ,int type )
{
File.Copy(path1, path2);

if (type == 0)
{
Class1 c1 = new Class1();
c1.ssavefile(path2, "E:\\bak\\e\\20090420.xml");
}
else if (type == 1)
{
Class1 c1 = new Class1();
c1.ssavefile(path2, "E:\\bak\\f\\20090420.txt");
}

}
//这个类里有很多操作,比如拷贝文件,写数据之类的.我在上面线程启动后,这些类里方法,也要用到.
public class Class1
{
public void ssavefile( string path1,string path2)
{
File.Copy(path1, path2);
}

}
我现在是出现了拷贝乱的情况,在class1中,在copyfile是没错的.请各位大侠指导一下这种情况下应怎么写线程比较好?必须得多线程.
...全文
329 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyangyanyue 2009-04-22
  • 打赏
  • 举报
回复
先读写锁对象,然后是所要读写的资源。
AcquireReaderLock方法支持递归读线程锁的请求,也就是说线程可以多次调用AcquireReaderLock方法,并且每次调用时会增加锁的计数。每次调用AcquireReaderLock时,必须调用一次ReleaseReaderLock来递减相应的计数,当计数达到0的时候,立即释放锁。
好像跑题勒~~~~~~~~~~~~~~
zhenwenjun1983 2009-04-21
  • 打赏
  • 举报
回复
你调用的方法涉及共享资源是就要保持同步,不然肯定乱。
多线程同步。
ouyangyanyue 2009-04-21
  • 打赏
  • 举报
回复
共享资源的多线程同步读写
Garnett_KG 2009-04-21
  • 打赏
  • 举报
回复
仔细看了一下,应该是匿名委托引用外部变量引起的问题。

try:


private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 2; i++)
{
string aa = "";
string bb = "";

if (i == 0)
{
aa = "E:\\bak\\a\\test.xml";
bb = "E:\\bak\\c\\a.xml";
}
else if (i == 1)
{
aa = "E:\\bak\\b\\test2.txt";
bb = "E:\\bak\\d\\wy.txt";
}

//COPY局部变量
string a = aa, b = bb;
int ti = i;

Thread t = new Thread(() => { copyfile(a, b, ti); });
t.Start();
}
}

startray 2009-04-21
  • 打赏
  • 举报
回复
就我提问题里的代码.你们没看吗?帮我看看为什么会拷贝乱?
startray 2009-04-21
  • 打赏
  • 举报
回复
没有混乱,就我上面写的代码.class1下面一个方法,然后各个线程完成后调用那个方法,就可以.但我现在发现拷贝错误呀
homejiji 2009-04-21
  • 打赏
  • 举报
回复
如果你只是拷贝的话不需要锁吧,就怕你自己搞混乱了,这边复制那边又覆盖什么的,还是先好好理清一下自己的代码。。。看看是不是逻辑上出现的混乱
startray 2009-04-21
  • 打赏
  • 举报
回复
楼上
我是想这样的.这个方法是共用的,传入两个参数,然后
File.Copy(path1, path2);
就这样,各干各的.这个方法在一个公共类中,我在前面一个winform中起了多个线程,多个线程有不同的路径,各个线程调用它时传它自个的.我是这样子想的,但现在发现不是这么回事,要是直接调用,拷贝的是错的.好像变量值给混啦.难道不能这样做吗?只能一个线程调用时就锁定,拷完再拷其它的?如果这个拷贝需要花费一天时间,那另一个线程企不是要等一天?如果10个线,一个线程花费一天的时候,那我最后的那个线程企不是要等9天?那我彻底O啦就
Garnett_KG 2009-04-21
  • 打赏
  • 举报
回复
同步就是要用锁啊.
或者你看下哪些数据是同享的,然后锁定那些数据。
startray 2009-04-21
  • 打赏
  • 举报
回复
楼上
你这是锁定吧?一个线程占用时,另一个不能使用.但我让两个线程同时使用呀.不能实现吗?只能锁定一个,等用完后再让别一个用?
Garnett_KG 2009-04-21
  • 打赏
  • 举报
回复
在Class1中加一个



private static object sync = new object();



然后修改ssavefile

public void ssavefile( string path1,string path2)
{
lock(sync)
{
File.Copy(path1, path2);
}
}
startray 2009-04-21
  • 打赏
  • 举报
回复
可以确保,因为我在路径里已指定死啦.
但现在已经拷贝乱啦.
ssavefile出的结果已错啦
LemIST 2009-04-21
  • 打赏
  • 举报
回复
线程同步问题,GOOGLE一下吧
LemIST 2009-04-21
  • 打赏
  • 举报
回复
private void copyfile( string path1,string path2 ,int type ) 
{
File.Copy(path1, path2);

if (type == 0)
{
Class1 c1 = new Class1();
c1.ssavefile(path2, "E:\\bak\\e\\20090420.xml");
}
else if (type == 1)
{
Class1 c1 = new Class1();
c1.ssavefile(path2, "E:\\bak\\f\\20090420.txt");
}

}

你得在这个函数里确保同一个文件只能同时由一个线程操作阿,不然肯定乱~~
startray 2009-04-21
  • 打赏
  • 举报
回复
轮流?你是指锁定吗?当一个线程使用该方法时其它不能使用,但那样达不到我的目的呀.我就是想同时,要是一个使用该方法时,其它不能使用,那与我不用多线程有啥区别?
jdhlowforever 2009-04-21
  • 打赏
  • 举报
回复
应该是轮流调用线程比较好吧.
startray 2009-04-21
  • 打赏
  • 举报
回复
楼上你是指那个?class1里的?ssavefile?
现在就是想做个比如,一点按钮,同时进行2个以上的拷贝这样的操作.但像我上面那样的,就拷贝的乱啦
线程与线程之间没什么交互,各干各的就成
蓝海D鱼 2009-04-21
  • 打赏
  • 举报
回复
做成静态 函数 怎么样
startray 2009-04-21
  • 打赏
  • 举报
回复
没有人吗
startray 2009-04-21
  • 打赏
  • 举报
回复
up

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧