异步执行GUI的“重”方法

时间:2011-10-13 13:11:34

标签: .net winforms optimization asynchronous

我必须做以下事情:

Public Sub OnMouseMove

  If mouseDownButNotYetMoved Then 
    myObjectsStateArchive.SaveObjectsState(myCurrentObjectsState.Clone())
  End If    

  MoveObjectsWithMouse()

End Sub

问题是SaveObjectsState方法非常“重”。因此,当用户移动鼠标时,它会相应地移动对象,但是对象被“延迟”,因为它等待SaveObjectsState完成...

我想可能异步执行保存...我的意思是,所有对象都在当前线程中,myObjectsStateArchive和myCurrentObjectState ...只是克隆和保存为“paralelized”的操作

使用ThreadPool或类似的东西,最好的方法是什么?

Public Sub OnMouseMove    
  If mouseDownButNotYetMoved Then 
    System.Threading.ThreadPool.QueueUserWorkItem( _
      New Threading.WaitCallback( _
        Sub(o)
          myObjectsStateArchive.SaveObjectsState(myCurrentObjectsState.Clone())
        End Sub))
  End If    

  MoveObjectsWithMouse()
End Sub

2 个答案:

答案 0 :(得分:2)

您可以使用.NET 4中提供的TaskFactory.StartNew Method。 来自另一个article

  

.NET 4中的新任务模式具有内置支持   与UI线程同步。这使得写作平行   与用户界面交互的应用程序比以往更容易   之前。

答案 1 :(得分:0)

您可以使用BackgroundWorker,使用线程来完成任务。您可以显示进度条(或任何其他通知方式),但要注意从线程更新GUI,ti链接可能有帮助:How to update GUI with backgroundworker?