2015-06-19 3 views
0

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

Эта логика не имеет возврата, она просто устанавливает статическую переменную. Но это может занять минуту, потому что оно подключается к БД.

Как я могу остановить пользовательский интерфейс WinFroms от замораживания? Я ищу простой подход, если возможно, новых классов и файлов.

+1

Использование 'Task' может быть? –

+0

взгляните на это: https://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx – stefankmitph

+0

'BackgroundWorker' может быть? – Sjips

ответ

5

Вот что я хотел бы сделать:

private async void ButtonClick() 
{ 
    //here, you're on the UI Thread 
    button1.Enabled = false; 

    await Task.Run(() => DoTheWork()); 

    //you're back on the UI Thread 
    button1.Enabled = true; 
} 

private void DoTheWork() 
{ 
    //this will be executed on a different Thread 
} 
+0

Спасибо за альтернативу решению М.КаземаАхбари: D – lukee910

+1

хорошо. На самом деле я этого не знал. плохо используйте свой путь в моих собственных проектах! благодаря ! это на самом деле лучше. используйте этот путь @ LukasDörig –

+0

Действительно, он выглядит очень чистым и простым. – lukee910

-1

У вас может быть thread, который выполняет расчет. Это может помочь: Threads in CSharp

+1

Это указывает на статью с 2003 года. За 12 лет на самом деле есть лучшие источники. –

0

Вы можете использовать BackgroundWorker:

BackgroundWorker worker = new BackgroundWorker(); 
worker.WorkerSupportsCancellation = false; 
worker.WorkerReportsProgress = false; 

worker.DoWork += (s, e) => 
    { 
     //perform action 
    }; 

worker.RunWorkerCompleted += (s, e) => 
    { 
     //close window 
    }; 

worker.RunWorkerAsync(); 

См this для более подробной информации.

+2

У нас есть TPL/await/async/etc. Я бы рекомендовал использовать задачи. – Andrew

0

при нажатии на кнопку:

button.Enabled = false; 
button.Text = "new text"; 
Task.Factory.StartNew(() => 
{ 
    // do your tasks here and close the window. 
    // type your code normally like calling methods. setting variables etc... 

    StaticVariable = ExampleUsingMethod(); 
}); 

, если необходимо назначить для интерфейса позже, то вам нужно dispatcher.for пример, если вы хотите кнопку для изменения внутри нового потока переменная.

Task.Factory.StartNew(() => 
{ 
     Dispatcher.Invoke(() => 
     { 
      button.Enabled = false; 
      button.Text = "new text"; 
     } 

     StaticVariable = ExampleUsingMethod(); 
}); 
+2

Я бы использовал await/async вместо диспетчера. – Andrew

+0

вы можете справиться лучше, но я попытался сохранить его простым для того, что спросил ОП. @Andrew –

+0

@ M.kazemAkhgary Спасибо за то, что он прост: D – lukee910

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

  • Нет связанных вопросов^_^