该怎么让多个线程一同暂停一同继续开始?

tiandiyuzhou1 2012-07-06 03:22:46

int Count;
int ShareCount = 3, SingleCount = 0, LastCount = 0;
string dest = @"E:\Test2\", source = @"E:\Test";
List<FileInfo> list = new List<FileInfo>();
StringBuilder sb = new StringBuilder();
bool stop = false;
public 多线程()
{
if (!Directory.Exists(dest))
Directory.CreateDirectory(dest);
DirectoryInfo di = new DirectoryInfo(source);
foreach (FileInfo f in di.GetFiles())
{
list.Add(f);
}
SingleCount = list.Count / ShareCount;
LastCount = list.Count % ShareCount;
ShareCount = LastCount == 0 ? ShareCount : ShareCount + 1;
sb.Capacity = list.Count * 15;
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < ShareCount; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(CopyFile));
thread.Name = "Thread:" + i;
thread.IsBackground = true;
thread.Start(i);
}
button1.Enabled = false;
}
protected void CopyFile(object i)
{
int j = (int)i;
int tempCount = j * SingleCount + SingleCount;
int totalCount = tempCount > list.Count ? list.Count : tempCount;
for (int c = j * SingleCount; c < totalCount; c++)
{
if (stop)
{
c--;
while (stop)
{
Thread.Sleep(500);
}
}
else
{
File.Copy(list[c].FullName, dest + list[c].Name, true);
Count++;
ShowTextBox(list[c].Name + " Count:" + Count + " " + Thread.CurrentThread.Name.PadLeft(9, ' ') + "\r\n");
ShowProgress();
}
}
}
protected void ShowTextBox(string msg)
{
if (this.textBox1.InvokeRequired)
{
this.textBox1.Invoke(new Action(() => ShowTextBox(msg)));
}
else
{
sb.Append(msg);
if (Count % 100 == 0)
this.textBox1.Text = sb.ToString();
}
}
protected void ShowProgress()
{
if (this.progressBar1.InvokeRequired)
{
this.progressBar1.Invoke(new Action(() => ShowProgress()));
}
else
{
int value = (int)((double)Count / (double)list.Count * 100);
this.progressBar1.Value = value;
label1.Text = value + "%";
}
}
private void button2_Click(object sender, EventArgs e)
{
stop = stop == false ? true : false;
}

for (int i = 0; i < ShareCount; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(CopyFile));
thread.Name = "Thread:" + i;
thread.IsBackground = true;
thread.Start(i);
}
这里我开了三个线程,当我点击button2的时候想让这三个线程挂起等待,等待唤醒的时候这几个线程才继续工作。这里我不懂怎么挂起线程,现在的做法是
while (stop)
{
Thread.Sleep(500);
}
一直死循环等待,直到stop为false。想真正让线程挂起来,而不是现在这样的,该怎么让线程挂起呢?
...全文
137 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dd_zhouqian 2012-07-06
  • 打赏
  • 举报
回复
这样还是用变量控制?

thread .Suspend();
thread .Resume();
bdmh 2012-07-06
  • 打赏
  • 举报
回复
你没有记录thread实例,所以你可以通过全局变量来限制,在线程中判断这个标识
还可参考http://archive.cnblogs.com/a/1554737/
niss 2012-07-06
  • 打赏
  • 举报
回复
mark一下,我还不会多线程的复杂编程

111,098

社区成员

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

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

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