【发布时间】:2019-10-28 12:02:33
【问题描述】:
在我的应用程序中,我从 LoginWindow 打开 MainWindow。当我调用 MainWindow.Show() 时,LoginWindow UI 冻结。我试过了:
await Task.Run() 但这不起作用,因为我需要在 UI 线程上打开窗口
等待 Application.Current.Dispatcher.BeginInvoke 但这似乎不能异步工作
我一定误解了异步编程的基本原理。
public async void LoginAsync(object pbx)
{
VisLoginLoading = Visibility.Visible;
var passwordBox = pbx as PasswordBox;
string enteredPassword = passwordBox.Password;
string cmdQuery = $"SELECT USERNAME, PASSWORD, AccessLevel, ALERTS, STORES FROM Tbl_UserAccounts WHERE USERNAME = @Username";
try
{
string errorMsg = await Task.Run(() =>
{
using (SqlConnection con = new SqlConnection(PosConString))
using (SqlCommand cmd = new SqlCommand(cmdQuery, con))
{
cmd.Parameters.AddWithValue("@Username", SqlDbType.NVarChar).Value = Username;
cmd.CommandTimeout = 30;
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
string password = reader.GetString(1);
if (DoesPasswordMatch(password, enteredPassword))
{
UserAccount.Username = (reader[0] == DBNull.Value) ? null : reader.GetString(0);
UserAccount.Access = Enum.IsDefined(typeof(UserAccess), reader.GetInt32(2)) ? (UserAccess)reader.GetInt32(2) : UserAccess.Unknown;
UserAccount.Alerts = (reader[3] == DBNull.Value) ? false : reader.GetBoolean(3);
UserAccount.Stores = (reader[4] == DBNull.Value) ? null : HelperMethods.ReturnWordList(reader.GetString(4));
return String.Empty;
}
else
{
return "Password is incorrect";
}
}
}
else
{
return "User does not exist";
}
}
return "Failed to login";
});
if (String.IsNullOrEmpty(errorMsg))
{
LoadApp();
}
else
{
MessageBox.Show(errorMsg);
}
}
catch (Exception ex)
{
MessageBox.Show($"Failed to login\n\n{ex}");
}
VisLoginLoading = Visibility.Hidden;
}
public async void LoadApp()
{
VisLoginLoading = Visibility.Visible;
await Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}));
foreach (Window window in Application.Current.Windows)
{
if (window.Title == "Login") window.Close();
}
VisLoginLoading = Visibility.Hidden;
}
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
-
认为这是因为 Dispatcher 和当前帧。您的主窗口在调度程序上推送了一个框架,现在阻止了登录窗口框架。
标签: c# wpf asynchronous