vbnet按钮终止循环的正确做法是什么?
vb.net吧
全部回复
仅看楼主
level 1
蓝梦妖蝶 楼主
我做了一个循环函数。想停止的时候用按钮终止循环。
但是一点按钮就未响应。达不到终止效果。正确做法是什么?
按钮代码
Private Sub PI_btnPItsp_Click(sender As Object, e As EventArgs) Handles PI_btnPItsp.Click
Stoprun = True
End Sub
循环代码:
For i = 0 To piphaseend Step 1
piphase = piphase + 1
If Stoprun Then
Exit For
End If
过程略
Next
2018年05月02日 03点05分 1
level 1
蓝梦妖蝶 楼主
2018年05月02日 03点05分 2
level 1
蓝梦妖蝶 楼主
还有一个问题。我循环里边加了一个textbox打印,结果是一直不显示。是不是反应太快了?
2018年05月02日 03点05分 3
还有,跑循环的时候,为什么显示未响应。但是其实程序是在工作的。在任务管理器里点不上程序,一闪一闪的。
2018年05月02日 09点05分
只有运行结束才会显示,因为你的循环阻塞了界面的刷新以及响应其他事件,具体解决楼下已经说了好几种了
2018年05月03日 16点05分
level 1
考虑用多线程
2018年05月02日 07点05分 4
level 10
1. 用线程
2. 在循环过程中执行一行代码 Application.DoEvents
2018年05月03日 05点05分 5
别人都说Application.DoEvents影响性能,吓得我不敢用[呵呵]
2018年05月03日 09点05分
回复 Ms_yam :用Task+Async+Await是坠吼滴
2018年05月03日 16点05分
两个办法都不行。代码见楼下
2018年05月04日 02点05分
level 1
蓝梦妖蝶 楼主
1,加入Application.DoEvents()之后成真死了。以前只是假死,现在一点直接崩溃了。
2,使用多线程也没有作用呢。主要是按钮不让点,点不动。
能点的时候报错:
System.NullReferenceException: 未将对象引用设置到对象的实例。
代码:
Imports System.Threading '多线程
Private T As System.Threading.Thread '新建线程
Private Sub PI_btnPItsp_Click(sender As Object, e As EventArgs) Handles PI_btnPItsp.Click
'Stoprun = True
T.Abort() '退出线程
End Sub
Private Sub PI_btnPIAtest_Click(sender As Object, e As EventArgs) Handles PI_btnPIAtest.Click
T = New System.Threading.Thread(AddressOf test_mix)
T.Start() '线程启动
End Sub
Private Sub test_mix()

End Sub
2018年05月04日 02点05分 6
少了一句,T.IsBackground=True
2018年05月04日 12点05分
level 11
因为方法不是异步的当然就占用UI线程导致后续的停止操作无法输入[汗],直接用线程是老方法了,.net Framework 4.0以上可以用异步和CancelToken。
2018年05月04日 03点05分 7
对这个不太熟。能不能帮忙写一下。谢谢大神!!
2018年05月04日 11点05分
level 1
公共变量声明在public module里
public isStop as boolean = false
线程:
private sub th()
while not isStop
...
end while
end sub
ui按钮里写
isStop = true
2018年05月04日 13点05分 8
最开始用的就是这个。UI点不了都。
2018年05月07日 01点05分
level 1
这个应该能满足你最简单的要求,但是并不是最好的方法
2018年05月04日 13点05分 9
level 11
因为终止循环需求很简单,所以最上面的那个cts可以改成Boolean,
然后只需要检查这个Boolean就是了。
用cts的原因只是我写规范代码的习惯,[汗]
CancellationToken是专门用来向线程发送取消通知的令牌。
2018年05月04日 13点05分 10
据说最好用ThrowIfCancelled,是这样吗?
2018年05月04日 17点05分
回复 Strawberry_BD : 如果只是要取消循环的运行结果的话Throw不Throw无所谓啦,如果要检测是中途取消的还是循环进行完了的话那么Throw就是了[汗]
2018年05月04日 23点05分
回复 jing_8956 :学习了,谢谢[太开心]
2018年05月04日 23点05分
谢谢大神。那个await里的sub。我单独做了一个 Private Sub,想着重复部分就直接用call sub代替了。但是提示“应为表达式”。await需要一个返回值。这个怎么处理好?
2018年05月07日 02点05分
level 1
放到子线程执行就不卡死了。子线程想要控制控件,还得加上一句,放在LOAD里也可以。
Control.CheckForIllegalCrossThreadCalls = False '多线程访问控键
2018年08月14日 15点08分 11
最好不要加这个,而是用invorke
2018年08月14日 19点08分
1