Windows 运行时中的意外多线程
Unintentional Multi-threading in Windows Runtime
我正在使用保存设置的 SettingsPane
,我的所有问题都已解决 - 除了一件事我显然无法控制。
这是相关的 SettingsPane.xaml:
<ComboBox Name="Themes" SelectionChanged="SettingSelectionChanged">
<ComboBoxItem Content="Theme 1" />
<ComboBoxItem Content="Theme 2" />
<ComboBoxItem Content="Theme 3" />
</ComboBox>
这是我的 SettingsPane.xaml.cs:
public Settings()
{
this.InitializeComponent();
this.DataContext = MainPage.Data;
Themes.SelectedIndex = 0;
}
private void SettingSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ApplicationData.Current.RoamingSettings.Values["Theme"] = Themes.SelectedIndex;
ApplicationData.Current.SignalDataChanged();
}
我处理 MainPage.xaml.cs 中的 SignalDataChanged()
电话:
public static MainPageVM Data = new MainPageVM();
public MainPage()
{
Windows.Storage.ApplicationData.Current.DataChanged += (a, o) =>
{
Data.Theme = (int) Windows.Storage.ApplicationData.Current.RoamingSettings.Values["Theme"];
};
}
Theme
存储在 MainPageVM.cs:
private int _theme = 0;
public int Theme
{
get { return _theme; }
set
{
if (value == _theme) return;
_theme = value;
OnPropertyChanged();
}
}
现在,绑定如下:
<Grid Background="{Binding Theme, Converter={StaticResource ThemeToBackground}}" Name="MainGrid">
除了一件事,它似乎在工作。当它遇到 Theme
的 setter 中的 OnPropertyChanged()
调用时,它崩溃并出现此错误:
Additional information: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
我该怎么办?
每个 window 都有一个与之关联的不同线程;如果涉及数据绑定,您应该避免从另一个页面引用一个页面的视图模型(您将需要一个适配器将更改推送到正确的线程)。 [编辑] 此外,该特定事件正在与任何页面无关的线程上引发。
我正在使用保存设置的 SettingsPane
,我的所有问题都已解决 - 除了一件事我显然无法控制。
这是相关的 SettingsPane.xaml:
<ComboBox Name="Themes" SelectionChanged="SettingSelectionChanged">
<ComboBoxItem Content="Theme 1" />
<ComboBoxItem Content="Theme 2" />
<ComboBoxItem Content="Theme 3" />
</ComboBox>
这是我的 SettingsPane.xaml.cs:
public Settings()
{
this.InitializeComponent();
this.DataContext = MainPage.Data;
Themes.SelectedIndex = 0;
}
private void SettingSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ApplicationData.Current.RoamingSettings.Values["Theme"] = Themes.SelectedIndex;
ApplicationData.Current.SignalDataChanged();
}
我处理 MainPage.xaml.cs 中的 SignalDataChanged()
电话:
public static MainPageVM Data = new MainPageVM();
public MainPage()
{
Windows.Storage.ApplicationData.Current.DataChanged += (a, o) =>
{
Data.Theme = (int) Windows.Storage.ApplicationData.Current.RoamingSettings.Values["Theme"];
};
}
Theme
存储在 MainPageVM.cs:
private int _theme = 0;
public int Theme
{
get { return _theme; }
set
{
if (value == _theme) return;
_theme = value;
OnPropertyChanged();
}
}
现在,绑定如下:
<Grid Background="{Binding Theme, Converter={StaticResource ThemeToBackground}}" Name="MainGrid">
除了一件事,它似乎在工作。当它遇到 Theme
的 setter 中的 OnPropertyChanged()
调用时,它崩溃并出现此错误:
Additional information: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
我该怎么办?
每个 window 都有一个与之关联的不同线程;如果涉及数据绑定,您应该避免从另一个页面引用一个页面的视图模型(您将需要一个适配器将更改推送到正确的线程)。 [编辑] 此外,该特定事件正在与任何页面无关的线程上引发。