zaibshaki Ответов: 1

C# WPF contextswitchdeadlock произошел при привязке 10000 изображений к listview


Everything working fine on 3000 to 4000 images when i am loading 10000 images in listview every error occured
ContextSwitchDeadlock occured

я читаю весь Источник изображения, используя этот код
<pre>  BitmapImage myBitmapImage = new BitmapImage();
                                        myBitmapImage.BeginInit();
                                        myBitmapImage.UriSource = new Uri(myImagesList[j].FilePath);
     myImagesList[j].getUri = myBitmapImage.UriSource;
     myBitmapImage.EndInit();
     this.Dispatcher.Invoke((Action)(() =>
        {
lstVisualDuplicateImage.Add(myImagesList[j]);
}));

Свяжите мой список с listview в RunWorkCompleted
private void FileLoadingWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
          if(lvImages != null)
          {
              lvImages.ItemsSource = lstVisualDuplicateImage;
              //view = (CollectionView)CollectionViewSource.GetDefaultView(lvImages.ItemsSource);
              //PropertyGroupDescription groupDescription = new PropertyGroupDescription("GrpNumber");
              //view.GroupDescriptions.Add(groupDescription);
              //txtTotalDuplicates.Text = "Total Files" + "(" + lstVisualDuplicateImage.Count + ")";
              //txtTotalGroups.Text = "Total Groups" + "(" + GroupNo + ")";

              pop.HidePopUp();
          }
      }


и XAML файл выглядит <
<Image Height="120" Width="120">

                                         <Image.Source>
                                             <BitmapImage
                     DecodePixelHeight="120"
                     DecodePixelWidth="120"
                     UriSource="{Binding Path=getUri, Mode=OneWay,UpdateSourceTrigger=Explicit }"
                     CreateOptions="IgnoreColorProfile"

                     CacheOption="None"  />
                                         </Image.Source>
                                     </Image>




Все работает нормально на 3000-4000 изображений, когда я загружаю 10000 изображений в listview каждая ошибка произошла
ContextSwitchDeadlock произошел

Что я уже пробовал:

Я работаю над приложением я сделал почти все никаких проблем с маленькими данными нет я перехожу к большим файлам no f каждый раз когда возникает ошибка ContextSwitcherror

1 Ответов

Рейтинг:
2

Graeme_Grant

ContextSwitchDeadlock обычно это указывает на то, что поток пользовательского интерфейса был занят слишком долго. Вы отключили VirtualStackPanel по ошибке или нарочно?

Вот тест со 100 000 пунктов, и он загружается и запускается почти мгновенно. Важно отметить, что VirtualStackPanel активно.

код XAML

<Window

    x:Class="VirtualListView.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"



    mc:Ignorable="d"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"



    Title="Virtualized ListView" Height="300" Width="500">

    <Grid>
        <ListView ItemsSource="{Binding Persons}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Avatar" Width="100">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Image Source="{Binding AvatarUrl}" Margin="10" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Name" Width="200" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

</Window>

с фоновым кодом
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        Mock();
    }

    public ObservableCollection<Person> Persons { get; set; }
        = new ObservableCollection<Person>();

    private Random rand = new Random();

    private void Mock()
    {
        for (int i = 0; i < 100000; i++)
        {
            Persons.Add(new Person
            {
                AvatarUrl = "http://www.freepngimg.com/download/happy_person/2-2-happy-person-free-download-png.png",
                Name = $"Person {i}",
                Age = rand.Next(20, 60)
            });
        }
    }
}

public class Person
{
    public string AvatarUrl { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}