如何在for循环中启动一个线程执行一个临时任务

liuzuofei 2019-10-24 10:44:59
现有这样一个问题,需要在for循环中执行一个临时任务,考虑使用线程。
代码可能如下:

for (int i = 0; i < 100; i++)
{
this.rtb_test.AppendText("for "+i.ToString()+"\n");
int temp = i;
Thread th = new Thread(new ParameterizedThreadStart(method));
th.Start(temp);
}

private void method(object obj)
{
this.rtb_test.AppendText(obj.ToString()+" thread xxxxx !!!!"+"\n");
}

可是,执行的结果是,只执行最后一个线程,中途的线程都没执行,貌似for循环不结束,线程就不会启动,如下图:

因此我的问题是:如何才能在for循环中,有效的执行线程(或者时钟)临时执行一个任务?
...全文
1358 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
advance_coder 2019-11-08
  • 打赏
  • 举报
回复
一个进程下能开100个线程么??
「已注销」 2019-11-03
  • 打赏
  • 举报
回复
你启动的线程都已经基本结束了,它们都已经执行了BeginInvoke。 但是因为你主线程在for循环中,所以没有时间去执行委托任务, 而委托任务都在队列里等着你的主线程去做。 所以等你for循环结束了,主线程空闲了,就去队列找任务做。
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(method);
            t.Start(0);
            Thread.Sleep(3000);//延时3秒
        }
        public void method(object obj)
        {
            BeginInvoke(new Action(() => {
                Debug.WriteLine("thread {0}:委托开始{1}", obj, Environment.NewLine);
                rtb_test.AppendText(String.Format("thread {0}:委托开始{1}", obj, Environment.NewLine));
            }));
            Debug.WriteLine("thread {0}:线程结束{1}", obj, Environment.NewLine);
        }
看到了吧,线程都结束了,主线程空闲了才执行委托。 所以给了你参考代码:
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(() => {
                for (int i = 0; i < 100; i++)
                {
                    Invoke(new Action(() => {
                        rtb_test.AppendText(String.Format("for {0}{1}", i, Environment.NewLine));
                    }));
                    Thread th = new Thread(method);
                    th.Start(i);
                }
            });
            thread.Start();
            rtb_test.AppendText(
                "委托工作都放在队列,主线程有空闲就能处理!\n" +
                "这句话说完了,空闲了就可以处理委托工作了!\n"
                );
        }
        public void method(object obj)
        {
            BeginInvoke(new Action(() => {
                rtb_test.AppendText(String.Format("thread {0}:委托开始{1}", obj, Environment.NewLine));
            }));
        }
cooljet123456 2019-11-02
  • 打赏
  • 举报
回复
引用 12 楼 liuzuofei的回复:
各位大佬,重新申明一下我真实目的: 我想要的是for循环还是按顺序执行,只是,在顺序执行中,偶尔会有一个异步的倒计时,这里我想用线程异步。在等待倒计时时不影响for循环顺序执行。等到倒计时的时间到,执行这个临时任务,而for循环还是继续按照既定的顺序执行。
你这需求干嘛用线程,开定时器
MikuLingSSS 2019-10-31
  • 打赏
  • 举报
回复
bool first=false; for... if(!first) th
  • 打赏
  • 举报
回复
学习了,每天进步一点点
yongjuan1688 2019-10-28
  • 打赏
  • 举报
回复
zhb_zhong 2019-10-28
  • 打赏
  • 举报
回复
其他两个库如果没有的话也自行pip下载。
如果你连pip都没有的话回头另
RunnerDNA 2019-10-28
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(String.Format("for {0}", i));
int temp = i;
Thread th = new Thread(new ParameterizedThreadStart(method));
th.Start(temp);
}
Console.ReadLine();
}
private static void method(object obj)
{
Console.WriteLine(String.Format("thread {0}!", obj));
}
这样写没有问题,可以满足楼主需求:

产生偏差的可能是UI线程BeginInvoke的影响
qqLu150 2019-10-28
  • 打赏
  • 举报
回复
扔线程池里不好么,门闩也跟上
weixin_35677485 2019-10-27
  • 打赏
  • 举报
回复
学习了,每天进步一点点
tyh 2019-10-27
  • 打赏
  • 举报
回复
学习了一下,我也是刚学这个
竹子酒 2019-10-26
  • 打赏
  • 举报
回复
线程的start需要时间
Calvin20100609 2019-10-26
  • 打赏
  • 举报
回复
看了你的需求,感觉你可以这么写,在FOR循环中,判断条件,条件满足调用settime win32 API,这个API的定时功能非常精确的,按settime的回调函数写入要执行的代码
liuzuofei 2019-10-26
  • 打赏
  • 举报
回复
引用 23 楼 货郎大叔 的回复:
用task如何
task怎么用呢? 不会,能否给一个例子,万分感谢!
货郎大叔 2019-10-26
  • 打赏
  • 举报
回复
用task如何
小风风12580 2019-10-26
  • 打赏
  • 举报
回复
异步即可,await,sync,Task.Run();
OrdinaryCoder 2019-10-26
  • 打赏
  • 举报
回复

  private static void method(object obj)
        {
            Console.WriteLine(obj.ToString() + " thread xxxxx !!!!" + "\n");
        }
for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("for " + i.ToString() + "\n");
                int temp = i;
                Task.Run(() => {
                    method(temp);
                });
            }
wanghui0380 2019-10-25
  • 打赏
  • 举报
回复
所以4楼的代码,如果你一定要想看到“显示成交替执行”简单容易 for { 新线程 我自己整个主线程先睡个2秒,那个新新线程就结束了,然后你就可以看到交替执行了 } 这也就是上次那个帖子“为啥你们鄙视,while true sleep”,我们的回答是,我们不鄙视while true sleep,我们鄙视的是他没搞清楚状况,只要不会的,只要不是自己想要的就一律sleep
wanghui0380 2019-10-25
  • 打赏
  • 举报
回复
另外4楼在我们看就是对的,因为对于计算机来说for 100,瞬间就已经结束了。而线程还在等待排程呢 所以你看到的是好像是那个for结束了,那些线程才开始 其实不是,其实是他们是一起的,不然你for个100w看看
wanghui0380 2019-10-25
  • 打赏
  • 举报
回复
额,何谓线程你不太明白啊,线程本来就不按顺序。按顺序的叫线程么,如果他按顺序走,线程就没任何难度,谁想开就开,有难度么?难度在线程调度和线程同步,信号量控制。 for { await xxxxtask (canceltoken) ----------即使是这样,这个xxxxtask 也是无顺序,依旧是for走for的,他自己走自己的 } 其实按照你的要求可以如此 for { task.delay(40).continuwith(xxxxxxx) 或者 await task.delay(40) xxxx } 当然对于我们来说,我们实在分不清你到底要同步还是异步,你要求交替一个for,一个任务交替那是同步OK。而你整个描述又说我要异步,所以到底是同步还是异步,俺们是弄不清了
加载更多回复(19)

110,571

社区成员

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

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

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