Блокировка темы в .Net - PullRequest
       11

Блокировка темы в .Net

3 голосов
/ 13 августа 2010

У меня есть класс, который имеет чисто статические методы и свойства. Я вызываю асинхронный метод для класса «Load», который запрашивает у веб-службы кусок данных, который затем запускает событие, которое выполняет метод возврата «LoadCompleted». Я понятия не имею, сколько времени займет вызов (разница между вызовом метода «Load» и вызовом метода «LoadCompleted»).

Я бы хотел заблокировать дальнейшее выполнение приложения до тех пор, пока не будет вызван метод обратного вызова (поскольку приложение будет пытаться получить данные из этого класса, который не заполняется до тех пор, пока метод LoadComplete не установит данные). Как мне это сделать?

Ответы [ 3 ]

6 голосов
/ 13 августа 2010

Следует избегать блокировки основного потока пользовательского интерфейса с предубеждением.

Я бы использовал BusyIndicator элемент управления из набора инструментов Silverlight: -

<UserControl x:Class="StackoverflowSpikes.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">

    <toolkit:BusyIndicator x:Name="busyInd" >
        <Grid x:Name="LayoutRoot">
          <!-- The rest of your content -->
        </Grid>
    </toolkit:BusyIndicator>

</UserControl>

Перед звонком Load используйте: -

busyInd.IsBusy = true;

затем на LoadComplete использовать: -

busyInd.IsBusy = false;

Это заблокирует пользовательский ввод в пользовательском интерфейсе без блокировки основного потока и даст некоторую обратную связь о том, почему они не могут ничего щелкать прямо сейчас. Вы можете предоставить свой собственный контент для сообщения о занятости, используя свойство BustContent. Конечно, если вам не нравится, как он выглядит, вы можете настроить его по своему вкусу.

Если вы хотите получить все MVVM, вы можете привязать свойство IsBusy к свойству виртуальной машины, которое указывает, что виртуальная машина не хочет, чтобы что-либо изменилось прямо сейчас.

2 голосов
/ 13 августа 2010

Вы можете использовать класс ManualResetEvent, чтобы заблокировать основной поток, если хотите.Просто вызовите метод WaitOne, чтобы заблокировать, и вызовите метод Set, чтобы разблокировать, когда веб-запрос asyc завершится.Просто имейте в виду, что если вы заблокируете основной поток пользовательского интерфейса, все ваше приложение станет полностью не отвечающим.

1 голос
/ 13 августа 2010

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

...