当前位置:编程学习 > C#/ASP.NET >>

winform多线程并发问题

            int k = 1;

            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {
                        while (true)
                        {
                            if (k == 1)
                            {
                                //业务代码,只会执行一次
                                k = 0;
                            }
                        }
                    });
                threadReceive.Start();
            }

小弟我是个新手,上边是我正在写的东西的一个简化版,现在有一事搞不懂:
这样写后边的线程肯定存在k在判断的时候就已经等于0了,业务代码得不到执行,
请问这种多线程并发的代码正确的写法是怎样的?
--------------------编程问答-------------------- 为什么要用一个变量来作为标识呢,你可以用event作为事件触发,来控制线程的同步
或者你先k=0,然后业务执行完k=1,不过还是建议用event去控制 --------------------编程问答-------------------- 你是要开多个线程,每个线程执行一次业务代码?

            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {  
                    //业务代码,只会执行一次
                    });
                threadReceive.Start();
            }


那这样就完了。 --------------------编程问答--------------------
引用 1 楼 bdmh 的回复:
为什么要用一个变量来作为标识呢,你可以用event作为事件触发,来控制线程的同步
或者你先k=0,然后业务执行完k=1,不过还是建议用event去控制


是这样的,k其实是一个全局变量,初始值为0,在触发按钮点击后将k的值改为1,线程都是一直在死循环的,我想做的是点一下按钮,让所有线程都执行且只执行一次业务代码,由于是第一次用到并发,所以感觉无从下手..
另外,event作为事件触发该怎么用呢? --------------------编程问答--------------------
引用 2 楼 Wind_Jece 的回复:
你是要开多个线程,每个线程执行一次业务代码?

            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {  
                    //业务代码,只会执行一次
                    });
                threadReceive.Start();
            }


那这样就完了。



+1 --------------------编程问答--------------------
引用 2 楼 Wind_Jece 的回复:
你是要开多个线程,每个线程执行一次业务代码?

            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {  
                    //业务代码,只会执行一次
                    });
                threadReceive.Start();
            }


那这样就完了。

死循环是必需要的,我想做的是让k变成全局变量,k=1放在按钮事件里,这样就每点一次按钮就执行且只执行一次业务代码. --------------------编程问答-------------------- 不光线程,你连自己的业务都没整明白呢... --------------------编程问答-------------------- 先整明白自己想做什么,再去考虑如何去做。
--------------------编程问答-------------------- while(true)也没跳出条件,线程会一直判断if(k == 1)                     
还有,为什么不在new Thread(()之前就先判断一下k的值呢,如果条件已经不满足了,就不需要再开线程了,然后跳出for --------------------编程问答--------------------
引用 6 楼 z81434362 的回复:
不光线程,你连自己的业务都没整明白呢...


在一堆死循环的线程里,有一个业务模块;在界面上每点击一次按钮,这个业务模块就执行且只执行一次,功能大概就是这样.
请问我这么写对吗? --------------------编程问答-------------------- 不知道你什么意思

如果for循环只想让每个线程顺序执行的话,为什么要用多线程呢,或者写一个线程,在线程里面执行for循环就ok了


如果是想多线程同时并发(但是你的代码的意思好像是顺序执行的),就没有必要引入k了。

还有就是你现在这样写肯定不符合你原来的意思,因为这样写的话,每次会产生不一样的结果。


如果你想用多线程,并想顺序执行(我觉得多线程此时毫无意义),建议使用Lock(k),就ok了
--------------------编程问答--------------------     static  int int_lock;
 
            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {
                        while (true)
                        {
                            if (k == 1)
                            {
                                lock(int_lock)
                                 {
                                   //业务代码,只会执行一次
                                   k = 0;
                                  }
                            
                            }
                        }
                    });
                threadReceive.Start();
            } --------------------编程问答-------------------- 功能实现了就得了 --------------------编程问答-------------------- 执行一次退出就可以了,不需要用k这个变量。
关键是你的业务代码中是否有些需要保护的代码。

如果这个k在其他进程中,有可能重新变成1,那么就使用对象吧,或者申明一个数组。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,