Я ищу решение для отключения кнопки входа, пока я получаю ответ из базы данных. Для многопоточности я использую Task
. С первым Task
я делаю вызов для подключения, затем создаю второй Task
для подключения их, чтобы не сделать cross-exception
. Насколько я понял, в первом Task
я не могу заблокировать кнопку, потому что получаю исключение, которое не могу использовать ресурсы из другого потока.Многопоточность с использованием кнопок Taks/disable и enable в WPF
Если кто-то может взглянуть на метод, который несет ответственность, я был бы благодарен.
public void LoginIntoApplication(Button loginButton)
{
dbConn = new DataBaseConnection(loginWindow.loginBox.Text, loginWindow.passwordBox.Password);
Task t = new Task(() =>
{
// Get data from db
dbConn.Connect();
});
Task t2 = t.ContinueWith(previouseTask =>
{
// Do smth with data
loginButton.IsEnabled = false;
var status = dbConn.OraCon;
if (status.State == ConnectionState.Open)
{
loginWindow.Hide();
testWindow = new TestWindow();
testWindow.Show();
}
else
{
loginButton.IsEnabled = true;
}
}, TaskScheduler.FromCurrentSynchronizationContext());
t.Start();
}
Заранее благодарен!
Оберните свой набор настроек loginButton.IsEnabled в Dispatcher.BeginInvoke или Invoke call - исходя из поведения, которое вам нужно. – VitaliyK
Почему вы используете холодные задачи и 'ContinueWith' вместо' async/await'? Это просто делает ваш код намного сложнее, * и * вы получаете фальшивый асинхронный вызов. PS, кроме соединения, ваш код имеет * no * вызовы базы данных. Где они? –
Что это должно выглядеть с 'async/await'? – yerpy