2014-09-07 3 views
2

Один из методов в моей программе UI элементов доступа к сети непрерывно и записывает файл. Это делает мой пользовательский интерфейс застрявшим когда-то. В это время мне нужно загрузить изображение gif загрузки. Но изображение появляется только после завершения задачи.Доступ к пользовательскому интерфейсу без зависания

Как мне изменить этот код, чтобы мое приложение не было висящим интерфейсом?

private void BCreate_Click(object sender, RoutedEventArgs e) 
{ 
    ImgLoading.Visibility = Visibility.Visible; 
    Thread newWindowThread = new Thread(new ThreadStart(RegUser)); 
    newWindowThread.Start(); 
} 

private void RegUser() 
{ 
    this.Dispatcher.Invoke((Action)(() => 
    { 
     //method body 
     .....   
     ImgLoading.Visibility = Visibility.Hidden; 
    })); 
} 
+0

Вы используете весь свой код в потоке пользовательского интерфейса. Почему вы создаете фоновый поток, а затем ничего не делаете? – SLaks

+0

Можете ли вы опубликовать больше кода и сообщить нам, какова ваша общая цель для метода? Скорее всего, есть намного лучший способ сделать это. – Wobbles

+0

@SLaks, bro Я уже закодировал 90% для своего проекта. Это действительно дополнительная функция. Изменение этого кода для фона немного сложно для меня – user3858462

ответ

2

Делают это так:

private void RegUser() 
{ 
    this.Dispatcher.Invoke((Action)(() => 
    { 
     ImgLoading.Visibility = Visibility.Visible; 
    })); 
    //method body 
    .....   
    this.Dispatcher.Invoke((Action)(() => 
    { 
     ImgLoading.Visibility = Visibility.Hidden; 
    })); 
} 

только вызывать методы, которые обращаются к UI.

Рассмотрите возможность использования InvokeAsync, чтобы что-то произошло, но не сразу.

+0

Спасибо за ваш ответ. Я думаю, что это так же, как мой вопрос. Я должен поместить все коды, которые получают доступ к пользовательскому интерфейсу, когда вы публикуете. Как этот метод RegUser() может свободно обращаться к любому компоненту пользовательского интерфейса без зависания интерфейса? – user3858462

+0

Ваша ошибка заключалась в том, чтобы вызывать ** весь метод ** в поток пользовательского интерфейса. Комбинация 'Thread' +' Invoke' обнуляет друг друга, так как * любой код * в 'Invoke' будет запускаться в потоке пользовательского интерфейса (эффективно блокируя его). Вместо того, чтобы вызывать метод body * метода *, вы должны поместить его в поток и * только вызывать * мелкие части, которые не передают интерфейс. – Sinatr

Смежные вопросы