我的页面上有加载动画的网格。
我需要做的是从加密文件中加载数据,并在该页面上用文本框填充文本框。而且,当对其进行加密时,它当然会花费一些时间来加载。这就是为什么我创建了加载动画的原因。
我创建了异步加载数据的功能,因此我可以显示加载屏幕,加载后我就将其隐藏。
看起来像这样:
public ArtaSettingsPage()
{
InitializeComponent();
VpnSettingsSavedLabel.Visibility = Visibility.Hidden;
LoadDataAsync();
async void LoadDataAsync()
{
await Task.Run(
() =>
{
var info = FileCryptoDecryptor.ReadEncryptedConfiguration("hakuna.xml.aes", Global_Variables.AppPassword);
string ArtaVPNIPSecKey = info.ArtaIPSECKey;
string ArtaVPNServer = info.ArtaVPNServer;
string ArtaVPNUsername = info.ArtaVPNUser;
string ArtaVPNPass = info.ArtaVPNPass;
string ArtaLocalAdminPass = info.ArtaLocalAdminPass;
string ArtaDomainAccUser = info.ArtaDomainAccUser;
string ArtaDomainAccPass = info.ArtaDomainAccPass;
string DecryptedArtaVPNIPSecKey = EncryDecryptor.Decrypt(ArtaVPNIPSecKey, "password");
string DecryptedArtaVPNServer = EncryDecryptor.Decrypt(ArtaVPNServer, "password");
string DecryptedArtaVPNUsername = EncryDecryptor.Decrypt(ArtaVPNUsername, "password");
string DecryptedArtaVPNPass = EncryDecryptor.Decrypt(ArtaVPNPass, "password");
string DecryptedArtaLocalAdminPass = EncryDecryptor.Decrypt(ArtaLocalAdminPass, "password");
string DecryptedArtaDomainAccUser = EncryDecryptor.Decrypt(ArtaDomainAccUser, "password");
string DecryptedArtaDomainAccPass = EncryDecryptor.Decrypt(ArtaDomainAccPass, "password");
DCIPBox.Text = info.ArtaDCIP;
VPNServerTextBox.Text = DecryptedArtaVPNServer;
ArtaIPSecKeyPasswordBox.Password = DecryptedArtaVPNIPSecKey;
ArtaVPNUsernameBox.Text = DecryptedArtaVPNUsername;
ArtaVPNPasswordBox.Password = DecryptedArtaVPNPass;
ArtaLocalAdminPassBox.Password = DecryptedArtaLocalAdminPass;
DomainAccUsernameTextbox.Text = DecryptedArtaDomainAccUser;
DomainAccPassTextbox.Password = DecryptedArtaDomainAccPass;
DomainTextbox.Text = info.ArtaDomain;
});
}
问题是当我调用它时,我在DCIPBox.Text = info.ArtaDCIP;
这行即时消息将文本框填充解密数据的行上得到异常。
“调用线程没有对象的权限,因为它归另一个线程所有。”
[我猜问题是,当我使用await时,如果我正确使用它,并且页面上的文本框之类的对象位于不同的“主”线程上,则会创建另一个线程来工作。
还有其他选择我该怎么办?
// EDIT
一个想法是将文本框解密后不填充文本框,但是我只是好奇是否有可能异步填充文本框并向用户显示已经充满信息的页面。
找到了解决方案:
您可以使用调度程序调用来更新来自不同线程的对象,如下所示:
DCIPBox.Dispatcher.BeginInvoke((Action)(() => DCIPBox.Text = info.ArtaDCIP));