C#线程问题

情似生活 2019-07-03 03:11:30
我点击按钮,开一个线程(传参),线程方法体是一个循环,线程结束后,继续点击按钮重开线程。
线程跑着发现我传的参是之前的参数(前面跑的参数是正常的,中间偶发参数改变)。
请问这是什么原因造成的。
...全文
1703 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2019-07-05
  • 打赏
  • 举报
回复
如果你愿意接受新语法,这东西很简单我现在就可以手写demo(伪代码) async button_Click() { 参数对象封装 xx=new 参数对象封装() await 处理(xx) } async task 处理( 参数对象封装 xx) { //这里你可以放锁控制,当然你到底想怎么弄我们不知道到,所以不给你东西,因为这种东西选择很多,需要考虑是同步/异步,用锁还是用信号量,并行的还是互斥的 //这里放你前面那一大串东西 var res= await xxxxxxxxx(另一个参数) //这里是号称的另一个需要很长时间处理的东西 //后面接着做你需要的什么更新UI那一堆操作 }
wanghui0380 2019-07-05
  • 打赏
  • 举报
回复
你的代码,混写了一大堆的东西,我们也不知道你想干嘛,然后到底哪里是你说的“什么东西修改了,偶尔是以前的” 我想问一下,你到底想干的是什么,那东西是要同步,还是异步。同时你愿意接受线程这种老语法,还是愿意接受task,async/wait这类新语法。 然后我们在来说后面的
茂大叔 2019-07-05
  • 打赏
  • 举报
回复
晕,你的循环只是不断的生成新的线程而已,哪有退出?
weixin_41999144 2019-07-04
  • 打赏
  • 举报
回复
不错,不错,不错,不错
bgtnhy01 2019-07-04
  • 打赏
  • 举报
回复
不错,不错,不错,不错
情似生活 2019-07-04
  • 打赏
  • 举报
回复
现在两个疑点:1.不知道是否多开了线程。2.传进去的参数是不是中途出了问题
xiaoxiangqing 2019-07-04
  • 打赏
  • 举报
回复
用task比较简单,判断task状态就行
lionheart922 2019-07-04
  • 打赏
  • 举报
回复
不要用thread,thread不太容易判断线程什么时候结束,用backgroundworker或者task就方便许多。
悠隼 2019-07-04
  • 打赏
  • 举报
回复
进来学习一下,谢谢楼主
還是 2019-07-04
  • 打赏
  • 举报
回复
加个断点调试吧老兄
weixin_45356102 2019-07-03
  • 打赏
  • 举报
回复
看的一脸懵逼
  • 打赏
  • 举报
回复
基于SSM框架的论坛怎么实现
qq_26125059 2019-07-03
  • 打赏
  • 举报
回复
学习了,谢谢楼主
情似生活 2019-07-03
  • 打赏
  • 举报
回复
引用 19 楼 wanghui0380 的回复:
所以,你开线程,传递一个公用对象,线程在开线程,而且里面还依赖一大堆公用对象

所以最终就是碰运气,期盼人家没改

新对象 xx=new 新对象
新对象.xxxxxx=你想传达的东西


xx.方法1=>{这个对象的这个方法在来,此时每次都是new的新对象,他跟别人没关系,他不依赖外面}


我在里面建了一个对象,
private void RunForPrint(object str)
{
if (str is ClassName)
{
ClassName cmT = (ClassName)str;
这样都会被污染吗
wanghui0380 2019-07-03
  • 打赏
  • 举报
回复
所以,你开线程,传递一个公用对象,线程在开线程,而且里面还依赖一大堆公用对象 所以最终就是碰运气,期盼人家没改 新对象 xx=new 新对象 新对象.xxxxxx=你想传达的东西 xx.方法1=>{这个对象的这个方法在来,此时每次都是new的新对象,他跟别人没关系,他不依赖外面}
wanghui0380 2019-07-03
  • 打赏
  • 举报
回复
一样的问题 https://bbs.csdn.net/topics/392748710 “别和陌生人说话”---------------否则风险自负。 所谓别和陌生人说话的概念-------一个方法就只改用别人传递给他的,他自己内部的,他自己创建的 别人传递给他的------------当参数传的 他自己内部的----------比如你上个帖子,人家建议你的,从新封装一个对象,你要起什么线程,在这个对象里玩。 他自己创建的-------------------他自己内部new的对象 你非要跨越-------非要说调用外面的一个参数-----------既然是调用外面的参数。那么外面可不管你,外面那些东西可不是线程安全的
情似生活 2019-07-03
  • 打赏
  • 举报
回复
引用 16 楼 ManBOyyy 的回复:
if (alarmFlag)
{
break;
}
你這個只是退出循環罢了,根本没有停止线程的啊。
你应该这样 Thread tMain;全局變量
bool loadedFlag=true;全局變量
再次點擊按鈕事件
if (loadedFlag)
{
tMain = null;
}
tMain = new Thread(new ParameterizedThreadStart(RunForPrint));
tMain.IsBackground = true;
tMain.Start(cm);
public void RunForPrint()
{
while (!loadedFlag)
{
if (!connectMLCb.Checked)
{
loadedFlag=true;
}
//等等
//thred = null;
}
}

循环退出,方法体结束。线程不是会退出了吗
ManBOyyy 2019-07-03
  • 打赏
  • 举报
回复
if (alarmFlag)
{
break;
}
你這個只是退出循環罢了,根本没有停止线程的啊。
你应该这样 Thread tMain;全局變量
bool loadedFlag=true;全局變量
再次點擊按鈕事件
if (loadedFlag)
{
tMain = null;
}
tMain = new Thread(new ParameterizedThreadStart(RunForPrint));
tMain.IsBackground = true;
tMain.Start(cm);
public void RunForPrint()
{
while (!loadedFlag)
{
if (!connectMLCb.Checked)
{
loadedFlag=true;
}
//等等
//thred = null;
}
}
情似生活 2019-07-03
  • 打赏
  • 举报
回复
引用 13 楼 OrdinaryCoder 的回复:
if(!isRun )
{
Thread tMain = new Thread(new ParameterizedThreadStart(RunForPrint));
tMain.IsBackground = true;
tMain.Start(cm);
}
看了一下 你线程内部是有标志位 但是没看见你用到这个isRun 在启动线程的时候判断一下 为false的时候再启动线程

我开了线程后判断的,代码贴出来了
加载更多回复(14)

110,535

社区成员

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

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

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