/ / Prečo môžete krížiť vlákno pridávanie ovládacích prvkov vo WinForms, ale nie WPF? - c #, .net, wpf, multithreading, winforms

Prečo môžete prechádzať pridaním ovládacích prvkov vo WinForms, ale nie WPF? - c #, .net, wpf, multithreading, winforms

V fiktívnej aplikácii WinForms, som "schopný vytvoriťZoznam v čase návrhu, vytvoriť pozadie vlákno za behu a potom pridať ovládacie prvky do zoznamu z vlákno pozadia. Ale ak som urobil to isté v WPF, dostanem chybu.

Prečo som schopný to urobiť vo WinForms, ale nie WPF? Nie je môj príklad WinForm rovnaký ako príklad WPF? Alebo je naozaj dôvod, prečo to funguje v poriadku WinForms a nie WPF?

WinForms:

private List<Label> _labels;

public Form1()
{
InitializeComponent();

Thread test = new Thread(DoStuff);
test.SetApartmentState(ApartmentState.STA);
test.Start();
}

private void DoStuff()
{
_labels = new List<Label>();

_labels.Add(new Label() { Text = "Label1" });
_labels.Add(new Label() { Text = "Label2" });
_labels.Add(new Label() { Text = "Label3" });

if (listBox1.InvokeRequired)
{
listBox1.Invoke((MethodInvoker)delegate { listBox1.DataSource = _labels; });
}
else
{
listBox1.DataSource = _labels;
}
}

WPF:

public partial class MainWindow : Window
{
private ObservableCollection<Label> _labels;
public MainWindow()
{
InitializeComponent();

Thread test = new Thread(DoStuff);
test.SetApartmentState(ApartmentState.STA);
test.Start();
}

private void DoStuff()
{
_labels = new ObservableCollection<Label>();
_labels.Add(new Label() { Content = "Label1" });
_labels.Add(new Label() { Content = "Label2" });
_labels.Add(new Label() { Content = "Label3" });

this.Dispatcher.BeginInvoke((Action)(() =>{ icMain.ItemsSource = _labels; }));
}
}

Toto je chyba, ktorú dostávam. Veľmi štandardné a očakávané:

tu zadajte popis obrázku

odpovede:

2 pre odpoveď č. 1

WinForms isn "t nie je tak prísny pri kontroleotázky súvisiace s krížením. To je pravdepodobne preto, že WinForms nemá "t skutočne mať ovládacie prvky, ako sú štítky. Skôr sú to len obálky okolo skutočných ovládacích prvkov, ktoré sú implementované na úrovni operačného systému."

Keďže ide o detail implementácie, existuježiadna záruka, že váš kód WinForms bude aj naďalej fungovať v budúcnosti. (To znamená, že nie je pod aktívnym vývojom, takže bude pravdepodobne pokračovať v práci.)


-2 pre odpoveď č. 2

Predpokladám, že pridanie detí, alebo niekedy modifikovaťvlastnosti ovládacích prvkov je zlá prax aj vo WinForms. WPF má len pokročilejšie spôsoby, ako kontrolovať prístup k používateľskému rozhraniu z iných vlákien a varuje vás v počiatočnom štádiu.

Súvisiaca otázka.