Я не могу объяснить, почему события подписки Prism перестают запускаться в зависимости от параметра ThreadOption - PullRequest
0 голосов
/ 15 февраля 2019

Я использую EventAggregator Prism 6 / MEF / MVVM в приложении, основанном на примерах MVFM Prism 6 MEF.У меня есть модель представления оболочки, которая публикует события, и несколько моделей представления, которые подписываются на события.События публикации просто передают параметр.События Subscribe указывают на ThreadOption.

Некоторые события подписки используют ThreadOption.UIThread.Другие используют ThreadOption.Background.Я просто думал, что Фон будет хорошей идеей.Я также был непоследователен.

Когда определенный MVVM является видимым и событие FuelCellsNearUpdated постоянно отправляет различные значения, все видимые окна экрана с событиями Subscribe с ThreadOption.BackgroundThread, по-видимому, прекращают обновление примерно через 2 минуты.Другие области окна экрана с MVVM, основанными только на UIThread, обновляются очень хорошо.

В отличие от других экранных окон, которые обновляют значения или прямоугольники, FuelCellsNearUpdated заставляет XAML ItemsControl обновлять таблицу 3x3, которая обновляет изображения и текст.Окна экрана не прекращают обновление, если значения FuelCellsNearUpdated не меняются или окно не отображается.

Я ищу объяснение того, почему события Subscribe перестают работать при использовании ThreadOption.Background.Мне нужно с некоторой уверенностью объяснить, что проблема, из-за которой окна перестают обновляться, решается, когда я просто использую ThreadOption.UIThread везде.

Если я изменю все события на ThreadOption.UIThread, все области окон экранаобновите, как ожидается, даже после нескольких дней непрерывной работы с FuelCellsNearUpdated.

Some code segments for a few view models:

ShellViewModel:
public ShellViewModel(IDbService dbService, ITagDataService tagDataService, IEventAggregator eventAggregator)
{}
private void RenderUpdateLoop()
{ ...
    EventAggregator.GetEvent<TagDataUpdatedEvent>().Publish(hmiDataInfo);
    EventAggregator.GetEvent<FuelCellInfoNearUpdatedEvent>().Publish(fuelCellsNear);
  ... 
    EventAggregator.GetEvent<UpdateHmiClocksEvent>().Publish(true);
  ...}

WinOperFooterViewModel:
[ImportingConstructor]
public WinOperFooterViewModel(ITagDataService tagDataService, IEventAggregator eventAggregator)
{
    EventAggregator = eventAggregator;
    this.tagDataService = tagDataService;

    EventAggregator.GetEvent<TagDataUpdatedEvent>().Subscribe(TagDataUpdated, ThreadOption.UIThread);
    EventAggregator.GetEvent<LogMsgEvent>().Publish("WinFooterViewModel initialization complete.");
}

WinOperFuelCellsViewModel:
public WinOperFuelCellsViewModel(ITagDataService tagDataService, IEventAggregator eventAggregator, IDbService dbService)
{...
    EventAggregator.GetEvent<FuelCellInfoNearUpdatedEvent>().Subscribe(FuelCellsNearUpdated, ThreadOption.BackgroundThread);
    EventAggregator.GetEvent<TagDataUpdatedEvent>().Subscribe(TagValuesUpdated, ThreadOption.BackgroundThread);
 ...}

WinOperFuelCellsView.xaml:
...
    <Grid x:Name="Grid">
    <Viewbox  x:Name="Viewbox" Stretch="Uniform" StretchDirection="Both">
        <Canvas x:Name="UnitCanvas" 
                Width="{Binding ContentWidth}" 
                Height="{Binding ContentHeight}"
                Background="Transparent">
            <ItemsControl Name="ChessBoard" ItemsSource="{Binding Cells}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas Background="Transparent" DataContext="{Binding}" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid x:Name="BorderCell" >
                                <Viewbox StretchDirection="DownOnly" Panel.ZIndex="100">
                                    <TextBlock x:Name="CurrentCell" Foreground="White" Text="{Binding Path=CellName}">
                                    <TextBlock.LayoutTransform>
                                        <RotateTransform Angle="{Binding Path=TextRotation}" />
                                    </TextBlock.LayoutTransform>
                                </TextBlock>
                                </Viewbox>
                                <Image Panel.ZIndex="1" Style="{StaticResource ChessPieceStyle}"/>
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                    <ItemsControl.ItemContainerStyle>
                        <Style>
                            <Setter Property="Canvas.Left" Value="{Binding ScalePos.X}" />
                            <Setter Property="Canvas.Top"  Value="{Binding ScalePos.Y}" />
                            <Setter Property="Canvas.Width"  Value="{Binding Width}" />
                            <Setter Property="Canvas.Height"  Value="{Binding Height}" />
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                </ItemsControl>
            <Canvas.LayoutTransform>
                <TransformGroup>
                    <RotateTransform Angle="{Binding Path=ScreenRotation}" />
                    <TranslateTransform Y="{Binding ActualWidth, ElementName=Viewbox}" />
                </TransformGroup>
            </Canvas.LayoutTransform>
        </Canvas>
    </Viewbox>
</Grid>
....

Если проблема с ThreadOption.Background, я ожидал, что она никогда не будет работать.

...