Асинхронно выполнять «тяжелый» метод GUI - PullRequest
0 голосов
/ 13 октября 2011

Мне нужно сделать следующее:

Public Sub OnMouseMove

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

  MoveObjectsWithMouse()

End Sub

Проблема в том, что SaveObjectsState метод очень "тяжелый". Таким образом, когда пользователь перемещает мышь, он ожидает, что объект перемещается соответствующим образом, но объект «задерживается», потому что он ожидает завершения SaveObjectsState ...

Я хотел бы, вероятно, выполнить асинхронное сохранение ... Я имею в виду, что все объекты находятся в текущем потоке, myObjectsStateArchive и myCurrentObjectState ... только операция клонирования и сохранения, чтобы быть "парализованными"

Какой был бы лучший метод, используя 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 ]

2 голосов
/ 13 октября 2011

Вы можете использовать TaskFactory.StartNew Метод , доступный в .NET 4. Из другой статьи :

новый шаблон задач в .NET 4 имеет встроенную поддержку синхронизация с потоком пользовательского интерфейса. Это делает написание параллельно приложения, которые взаимодействуют с пользовательским интерфейсом проще, чем когда-либо до этого.

0 голосов
/ 13 октября 2011

Вы можете использовать BackgroundWorker, используя поток для выполнения задачи.Вы можете показать индикатор выполнения (или любой другой способ уведомления), но будьте осторожны с обновлением GUI из потока, ссылка может быть полезной: Как обновить GUI с backgroundworker?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...