Как передать ссылку на объект в задачу (TPL)? - PullRequest
4 голосов
/ 21 ноября 2011

У меня есть метод, который я хочу выполнить в фоновом режиме, используя задачу.Метод, однако, требует ссылки на объект в качестве параметра.Однако объект создается в потоке пользовательского интерфейса, и поэтому я получил «Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им».исключение.Как мне это сделать?

Task.Factory.StartNew(() => SerializeGraphicsLayer(graphicsLayer, fileUrl))
                    .ContinueWith((t) => UpdateSaveOperation(t), TaskScheduler.FromCurrentSynchronizationContext()); 

Метод SerializeGraphicsLayer () - это тот, который я хочу использовать в фоновом режиме, однако мне нужно передать ссылку на объект, созданный в потоке пользовательского интерфейса, чтобыэтот метод ...

РЕДАКТИРОВАТЬ: метод (который работает в фоновом режиме) может вызвать исключение, и метод UpdateSaveOperation () сделает необходимое сообщение об ошибке в пользовательском интерфейсе.

Iхотел бы иметь хорошую обработку исключений, и поэтому я выбрал Task для этого?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

В WPF вы можете использовать класс Dispatcher для выполнения тяжелых задач, не связанных с пользовательским интерфейсом, которые можно легко перенести в фоновый поток.Для получения дополнительной информации ознакомьтесь со следующей статьей: Понимание «Dispatcher» в WPF

При вызове методов через Dispatcher вы можете передать любой объект в качестве параметра, а в вызываемом методе вам потребуетсябросьте его обратно в исходный тип.

1 голос
/ 21 ноября 2011

Объект пользовательского интерфейса не подходит для использования в фоновом потоке. Если возможно, вы можете получить значения , которые вам нужны, и захватить их в вашу операцию:

string name = userName.Text; // access values on UI thread
Task.Factory.StartNew(() => /* something using name, but not the UI control*/ );

Однако, если вам нужно обновить значения назад в пользовательском интерфейсе, вам придется вернуться в поток пользовательского интерфейса. Если все , которое вы делаете, обновляет пользовательский интерфейс, вы также можете не использовать TPL (это не очень подходит).

...