我正在开发一个大型程序的功能。该功能需要调用一些计算密集型的东西,并且可能需要很长时间。从菜单项触发的计算结果将向当前图形添加一些内容。
还有许多其他选项可以更改当前图形。我不是在这里讨论它们。可以这么说,我希望我创建的“处理”是异步的,这样用户就不必盯着一个无响应的屏幕 5 分钟以为程序坏了,但能够点击其他地方...
所以:处理将是异步的,但最后,我将不得不绘制结果。
问题:我不会画画。
如果我在没有异步调用的情况下运行我的代码,当然一切都会完美运行。但是如果我在 BeginInvoke 上调用处理,就会出现一些问题:
1)我调用的方法立即返回,所以在主线程中,如果我调用“draw”,结果还没有生成
2) 如果我尝试在 EndInvoke 之后进行绘图,则它位于错误的线程上,因此 myGraphics 中的每个项目都显示“参数无效”。
3)即使我在 BeginInvoke 之后保持通话(并以某种方式重新调用它),myGraphics 似乎仍然转到了另一个线程,我似乎有错误的信息。
为了获得最佳结果,我应该能够在 EndInvoke 之后从线程返回,以某种方式关闭它们......我只是不知道如何。
以下代码是一个片段,旨在显示对“处理”的调用,然后是“绘制”。(编辑:我已经从代码中删除了更多内容,因此人们不会尝试输入它并认为我的问题是基本的编译错误,例如拼写错误或其他东西)
Public Sub mine(ByVal myGraphics As System.Drawing.Graphics)
a_call()
' use results from the finished call to process graphics
my_draw(myGraphics)
' if I add my_draw here, previous call only had BeginInvoke... more complicated to prevent my_draw...
' but it is not horrible to have first draw empty, and later draw correctly (if there is a way to trigger it - which I don't really have)
' The bigger problem is, myGraphics becomes defective (its VisibleClipbounds change, most points are not drawn anymore - or it becomes undefined)
' I don't understand why myGraphics changes or how to fix it
end sub
Public Sub a_call()
Dim c As New ADelegate(AddressOf A) ' which is the processing call
c.BeginInvoke(cb, Nothing)
End Sub
Private Sub A_Callback(ByVal ia As IAsyncResult)
...EndInvoke(ia)
A_Finish()
End Sub
Private Sub A_Finish()
If Me.InvokeRequired Then
Invoke(New ADelegate(AddressOf A_Finish))
Else
' call my_draw because I should be done with the Invoke ?
' If I add my_draw here, it is undefined
End Sub
当我说 myGraphics 被修改时......我真的看不出有什么可以改变它......
我一直在努力理解线程和委托......任何帮助表示赞赏。