winform多线程并发问题

rsongziwen 2013-06-18 10:06:29
            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了,业务代码得不到执行,
请问这种多线程并发的代码正确的写法是怎样的?
...全文
336 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
much0726 2013-06-19
  • 打赏
  • 举报
回复
执行一次退出就可以了,不需要用k这个变量。 关键是你的业务代码中是否有些需要保护的代码。 如果这个k在其他进程中,有可能重新变成1,那么就使用对象吧,或者申明一个数组。
jiaoshiyao 2013-06-19
  • 打赏
  • 举报
回复
功能实现了就得了
rsongziwen 2013-06-18
  • 打赏
  • 举报
回复
引用 6 楼 z81434362 的回复:
不光线程,你连自己的业务都没整明白呢...
在一堆死循环的线程里,有一个业务模块;在界面上每点击一次按钮,这个业务模块就执行且只执行一次,功能大概就是这样. 请问我这么写对吗?
  • 打赏
  • 举报
回复
while(true)也没跳出条件,线程会一直判断if(k == 1) 还有,为什么不在new Thread(()之前就先判断一下k的值呢,如果条件已经不满足了,就不需要再开线程了,然后跳出for
cheng2005 2013-06-18
  • 打赏
  • 举报
回复
先整明白自己想做什么,再去考虑如何去做。
五更琉璃 2013-06-18
  • 打赏
  • 举报
回复
不光线程,你连自己的业务都没整明白呢...
rsongziwen 2013-06-18
  • 打赏
  • 举报
回复
引用 2 楼 Wind_Jece 的回复:
你是要开多个线程,每个线程执行一次业务代码?

            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {  
                    //业务代码,只会执行一次
                    });
                threadReceive.Start();
            }
那这样就完了。
死循环是必需要的,我想做的是让k变成全局变量,k=1放在按钮事件里,这样就每点一次按钮就执行且只执行一次业务代码.
coobai 2013-06-18
  • 打赏
  • 举报
回复
引用 2 楼 Wind_Jece 的回复:
你是要开多个线程,每个线程执行一次业务代码?

            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {  
                    //业务代码,只会执行一次
                    });
                threadReceive.Start();
            }
那这样就完了。
+1
rsongziwen 2013-06-18
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
为什么要用一个变量来作为标识呢,你可以用event作为事件触发,来控制线程的同步 或者你先k=0,然后业务执行完k=1,不过还是建议用event去控制
是这样的,k其实是一个全局变量,初始值为0,在触发按钮点击后将k的值改为1,线程都是一直在死循环的,我想做的是点一下按钮,让所有线程都执行且只执行一次业务代码,由于是第一次用到并发,所以感觉无从下手.. 另外,event作为事件触发该怎么用呢?
  • 打赏
  • 举报
回复
你是要开多个线程,每个线程执行一次业务代码?

            for (int i = 0; i < 100; i++)
            {
                Thread threadReceive = new Thread(() =>
                    {  
                    //业务代码,只会执行一次
                    });
                threadReceive.Start();
            }
那这样就完了。
bdmh 2013-06-18
  • 打赏
  • 举报
回复
为什么要用一个变量来作为标识呢,你可以用event作为事件触发,来控制线程的同步 或者你先k=0,然后业务执行完k=1,不过还是建议用event去控制
  • 打赏
  • 举报
回复
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(); }
  • 打赏
  • 举报
回复
不知道你什么意思 如果for循环只想让每个线程顺序执行的话,为什么要用多线程呢,或者写一个线程,在线程里面执行for循环就ok了 如果是想多线程同时并发(但是你的代码的意思好像是顺序执行的),就没有必要引入k了。 还有就是你现在这样写肯定不符合你原来的意思,因为这样写的话,每次会产生不一样的结果。 如果你想用多线程,并想顺序执行(我觉得多线程此时毫无意义),建议使用Lock(k),就ok了

110,539

社区成员

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

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

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