Легкая нарезка резьбы в WPF - PullRequest
0 голосов
/ 18 марта 2010

Я много читал о потоках в C #, WPF и Silverlight, но не могу заставить его работать.

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

Мои таймеры меняют значения меток и текстовых полей, но заставить их делать это в другом потоке, очевидно, некуда.

Так может ли кто-нибудь дать мне несколько примеров того, как добиться того, что мне нужно сделать?

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

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

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

1 голос
/ 18 марта 2010

Хитрость в том, что ваша логика пользовательского интерфейса должна выполняться в потоке пользовательского интерфейса. Существуют методы, которые делают это проще, чем могло бы быть, но их использование может быть сложным. Вот как я это делал в прошлом:

Сначала вы должны объявить делегата, которого вы можете передать методу Dispatcher.Invoke:

private delegate void UIDelegate();

Затем вы можете настроить фоновый рабочий файл и вызвать его метод RunWorkerAsync:

BackgroundWorker loadWorker = new BackgroundWorker();
loadWorker.DoWork += new DoWorkEventHandler(loadWorker_DoWork);
loadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(loadWorker_RunWorkerCompleted);
loadWorker.RunWorkerAsync();

Затем, чтобы обновить элементы пользовательского интерфейса, вы должны вызвать их диспетчер:

private void changeStatusLabel(string status)
{
    progressLabel.Dispatcher.Invoke(new UIDelegate(delegate
    {
        progressLabel.Content = status;
    }));
}

Они вырезаны из более крупных методов и, вероятно, могут быть немного оптимизированы. Тем не менее, это даст вам место для начала.

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