Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 调用委托后无法使用图形_Vb.net_Multithreading_Graphics_Delegates_Callback - Fatal编程技术网

Vb.net 调用委托后无法使用图形

Vb.net 调用委托后无法使用图形,vb.net,multithreading,graphics,delegates,callback,Vb.net,Multithreading,Graphics,Delegates,Callback,我正在一个大型程序上开发一个功能。该功能需要调用一些计算密集型的东西,并且可能需要很长时间。从菜单项触发的计算结果将向当前图形中添加某些内容 还有许多其他选项可以更改当前图形。我不是在这里讨论这些问题。可以说,我希望我创建的“处理”是异步的,这样用户就不必盯着一个没有响应的屏幕看5分钟,以为程序坏了,但可以单击其他地方 因此:处理将是异步的,但在最后,我必须绘制结果 问题是:我不会画画 如果我运行我的代码,而不进行异步调用,那么当然,一切都可以完美地工作。但如果我在BeginInvoke上调用处

我正在一个大型程序上开发一个功能。该功能需要调用一些计算密集型的东西,并且可能需要很长时间。从菜单项触发的计算结果将向当前图形中添加某些内容

还有许多其他选项可以更改当前图形。我不是在这里讨论这些问题。可以说,我希望我创建的“处理”是异步的,这样用户就不必盯着一个没有响应的屏幕看5分钟,以为程序坏了,但可以单击其他地方

因此:处理将是异步的,但在最后,我必须绘制结果

问题是:我不会画画

如果我运行我的代码,而不进行异步调用,那么当然,一切都可以完美地工作。但如果我在BeginInvoke上调用处理,则会出现一些问题:

1) 我调用的方法立即返回,因此在主线程中,如果我调用“draw”,结果还没有生成

2) 如果我试图将绘图放在EndInvoke之后,它位于错误的线程上,因此myGraphics中的每一项都会显示“参数无效”

3) 即使我在开始调用后立即保持调用(并以某种方式重新调用),我的图形仍然似乎转到了另一个线程,我似乎有错误的信息

为了获得最佳结果,我应该能够从线程返回,在EndInvoke之后以某种方式关闭它们。。。我只是不知道怎么做

下面的代码是一个片段,旨在显示对“processing”的调用,然后是“draw”。(编辑:我已经从代码中删除了更多内容,这样人们就不会试图键入代码,并认为我的问题是基本的编译错误,比如打字错误或其他错误)

当我说我的图形被修改。。。我真的看不出什么能改变它


我一直在努力理解线程,代表们。。。非常感谢您的帮助。

我发现System.Drawing.Graphics不能被任何函数“拥有”,因此像球一样被传递是没有意义的

由于它属于一个UI类,并且是通过绘制事件正确创建的,所以我的解决方案是将绘图过程与计算过程断开连接


在绘制之前,我没有等待计算完成,而是在有新信息绘制时单独绘制(由绘制事件触发),并异步计算,完全不考虑UI中发生的任何事情。

我可以看到有人否决了我的问题,并投票关闭了它,没有评论——不管是否有用。我已经为这个问题争论了两天,所以如果你认为我没有付出足够的努力,或者有类似的问题,请给我一个提示——让我来处理类似的问题。非常感谢您提供的任何建设性帮助。您使用的编译选项是什么?选项显式打开?如果必须在绘图之前完成
Y()
所做的处理,那么异步调用它有什么好处?
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