关于vb.net的invoke,请各位指教。

eric83326 2010-04-21 11:04:33
    Public Sub UpdateUI()
Dim mrs As New Thread(AddressOf MonitorRASStatusAsync)
mrs.Abort()
Dim newDelegate As New UIDelegate(AddressOf UpdateUI)
If Me.InvokeRequired Then
Me.Invoke(newDelegate)
Else
Label2.Visible = True
state.Text = "连接已断开"
username.Visible = True
userpass.Visible = True
connect.Enabled = True
remember.Visible = True
End If
If autoredial.Checked = True Then
If Me.InvokeRequired Then
Me.Invoke(newDelegate)
Else
Label2.Visible = False
state.Text = "正在连接中"
username.Visible = False
userpass.Visible = False
connect.Enabled = False
remember.Visible = False
End If
Call dial()
End If
End Sub


以上代码里,Call dial()会被执行三次,何故?要怎样才能让它只执行一次,通过获取连接状态貌似不行,不管连接建立还是连接断开,其rasconnstate的值都是8192。
还有在断开按钮那里,如果重拨过了,那么rashangup(hrasconn)完全没用,很是奇怪。
...全文
1380 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
eric83326 2010-04-22
  • 打赏
  • 举报
回复
        Dim newDelegate As New UIDelegate(AddressOf UpdateUI)
If Me.InvokeRequired Then
Me.Invoke(newDelegate)
Else
Label2.Visible = True
state.Text = "连接已断开"
username.Visible = True
userpass.Visible = True
connect.Enabled = True
remember.Visible = True
If autoredial.Checked = True Then

Label2.Visible = False
state.Text = "正在连接中"
username.Visible = False
userpass.Visible = False
connect.Enabled = False
remember.Visible = False
Call dial()
End If
End If


改成这样,就只执行一次了,而且也可以在重拨后手动断开。
兔子-顾问 2010-04-22
  • 打赏
  • 举报
回复

Public Sub UpdateUI()
Dim mrs As New Thread(AddressOf MonitorRASStatusAsync)' 定义线程,但没启动
mrs.Abort()'停止了
Dim newDelegate As New UIDelegate(AddressOf UpdateUI)'声明委托
If Me.InvokeRequired Then'如果跨线程调用
'通过委托,调用UpdateUI,相当于递归调用自己了,调用完成后继续执行
Me.Invoke(newDelegate)
Else
Label2.Visible = True
state.Text = "连接已断开"
username.Visible = True
userpass.Visible = True
connect.Enabled = True
remember.Visible = True
End If
'如果跨线程调用,则执行完invoke后也会执行到这里,但下面直接访问了ui
If autoredial.Checked = True Then
If Me.InvokeRequired Then'如果跨线程访问ui
Me.Invoke(newDelegate)'再次递归调用自己
Else
Label2.Visible = False
state.Text = "正在连接中"
username.Visible = False
userpass.Visible = False
connect.Enabled = False
remember.Visible = False
End If
Call dial()
End If
End Sub
eric83326 2010-04-22
  • 打赏
  • 举报
回复
我已经知道原因了,现在在想怎么改,不过return的确没用,要么不执行call dial(),要么执行三遍。
兔子-顾问 2010-04-21
  • 打赏
  • 举报
回复
只是走读代码,给出点建议
Me.Invoke(newDelegate)
每次执行完后,加一句return

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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