2013-11-17 4 views
1

Ну, я боролся с этим некоторое время, и я не смог найти решение. Я разрабатываю одно из тех приложений-кассиров, которые вы видите в супермаркете, где все работает быстро, как черт. Кассиры знают программу настолько хорошо, что просто набирают скорость света, поэтому пользовательский интерфейс должен быть невероятно отзывчивым.Thread Starts lags UI WPF

В любом случае, поскольку я только кодировал в WPF, я использую его, если кто-то говорит, что WinForms быстрее, я обязательно его изучу. Это мой код, это очень просто, как я тестирование производительности

public partial class MainWindow : Window 
{ 
    Thread t; 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 

     t = new Thread(HandleThread); 
     t.Start(); 
    } 

    private void HandleThread() 
    { 
     Thread.Sleep(3000); 
    } 
} 

Всякий раз, когда кнопка нажата, запускается новый поток, как я планирую на подключение к серверу в новом потоке. Моя проблема заключается в способе button_Click ОЧЕНЬ МЕДЛЕННО. Возврат занимает около 1 секунды, поэтому кнопка выглядит так, как будто она застряла, и приложение выглядит вялым. Я пробовал темы, BackgroundWorker, изменил фреймворк на 4.0 и попытался Tasks. НИЧЕГО. Что бы я ни делал, чтобы начать какую-то фоновую работу, метод берет навсегда.

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

+0

Если для обработчика Button_Click действительно требуется примерно 1 сек для обработчика Button_Click, то на каком скудном оборудовании он работает? – elgonzo

+0

Это происходит каждый раз или только при первом нажатии кнопки? Может быть компиляция JIT, хотя и маловероятна. – Asik

+0

Его работа на Windows 7, Intel Core I7 8GB Ram, SSD. Это происходит только в первый раз, если я нажму на него снова, он работает так, как должен. Проблема заключается в том, что человек, щелкнувший по нему, не будет нажимать на него снова, поскольку он должен войти в систему. –

ответ

4

Вы должны отключить IntelliTrace (How-To).

  1. В меню «Сервис» выберите «Параметры».
  2. В диалоговом окне «Параметры» разверните узел IntelliTrace и нажмите «Общие».
  3. Снимите флажок Включить IntelliTrace.
  4. Нажмите OK.
+0

Could вы уточните, почему это должно помочь? Обычно IntelliTrace не замедляет выполнение до * этой * степени. Если это так, истинная причина может быть вызвана большим количеством исключений, поэтому просто отключить IT можно просто скрыть, но не решить проблему. – pbalaga

+0

Отлично! Я не знаю, почему, но это решило мою проблему! –

+0

@pbalaga Я тоже не знаю, почему, но это также мои проблемы с WPF. – AgentFire

1

Нужно ли создавать новую тему при каждом нажатии кнопки? Является ли эта нить долговечной? Вы действительно хотите выделить 1 мегабайт пространства стека (на 64-битных операционных системах) для этого каждый раз, когда вы нажимаете эту кнопку? Действительно ли вы не хотите использовать задачу TPL и CancellationTokenSource?

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

public void OnClick(object src,EventArgs args) 
{ 
    var login = tbLogin.Text;// assuming non MVVM coding here 
    var pwd= tbPass.Text; 
    Task.Factory.StartNew(()=>{ 
     return _myWebService.CheckAuth(login,pwd); // your login stuff here 
    }).ContinueWith(wsTask=>{ 
     if(!wsTask.IsCompleted){ // handle errors/cancel } 
     DisplayLoginState(ws.Result); 
    }, TaskScheduler.FromCurrentSynchronizationContext()); // this runs on the UI Thread 

}