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();
}
那这样就完了。 --------------------编程问答--------------------
是这样的,k其实是一个全局变量,初始值为0,在触发按钮点击后将k的值改为1,线程都是一直在死循环的,我想做的是点一下按钮,让所有线程都执行且只执行一次业务代码,由于是第一次用到并发,所以感觉无从下手..
另外,event作为事件触发该怎么用呢? --------------------编程问答--------------------
+1 --------------------编程问答--------------------
死循环是必需要的,我想做的是让k变成全局变量,k=1放在按钮事件里,这样就每点一次按钮就执行且只执行一次业务代码. --------------------编程问答-------------------- 不光线程,你连自己的业务都没整明白呢... --------------------编程问答-------------------- 先整明白自己想做什么,再去考虑如何去做。
--------------------编程问答-------------------- while(true)也没跳出条件,线程会一直判断if(k == 1)
还有,为什么不在new Thread(()之前就先判断一下k的值呢,如果条件已经不满足了,就不需要再开线程了,然后跳出for --------------------编程问答--------------------
在一堆死循环的线程里,有一个业务模块;在界面上每点击一次按钮,这个业务模块就执行且只执行一次,功能大概就是这样.
请问我这么写对吗? --------------------编程问答-------------------- 不知道你什么意思
如果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#