Ich habe einen Hintergrund Thread, der eine Reihe von BitmapImage
Objekte erzeugt. Jedes Mal, wenn der Hintergrund-Thread die Erstellung einer Bitmap beendet, möchte ich diese Bitmap dem Benutzer zeigen. Das Problem besteht darin herauszufinden, wie Sie die BitmapImage
aus dem Hintergrundthread an den UI-Thread übergeben.Wie übergibt man ein BitmapImage von einem Hintergrundthread an den UI-Thread in WPF?
Dies ist ein MVVM Projekt, so meine Ansicht hat ein Image
Element:
<Image Source="{Binding GeneratedImage}" />
My view-Modell verfügt über eine Eigenschaft GeneratedImage
:
private BitmapImage _generatedImage;
public BitmapImage GeneratedImage
{
get { return _generatedImage; }
set
{
if (value == _generatedImage) return;
_generatedImage= value;
RaisePropertyChanged("GeneratedImage");
}
}
Meine Ansicht-Modell auch den Code hat, dass erzeugt den Hintergrundthread:
public void InitiateGenerateImages(List<Coordinate> coordinates)
{
ThreadStart generatorThreadStarter = delegate { GenerateImages(coordinates); };
var generatorThread = new Thread(generatorThreadStarter);
generatorThread.ApartmentState = ApartmentState.STA;
generatorThread.IsBackground = true;
generatorThread.Start();
}
private void GenerateImages(List<Coordinate> coordinates)
{
foreach (var coordinate in coordinates)
{
var backgroundThreadImage = GenerateImage(coordinate);
// I'm stuck here...how do I pass this to the UI thread?
}
}
möchte ich irgendwie weitergeben backgroundThreadImage
auf dem UI-Thread, wo es uiThreadImage
werden wird, stellen Sie dann GeneratedImage = uiThreadImage
so die Ansicht aktualisieren. Ich habe mir einige Beispiele zum WPF Dispatcher
angeschaut, aber ich kann kein Beispiel finden, das dieses Problem angeht. Bitte beraten.
Dies ist hilfreich, Simon, danke. Aber wie komme ich dazu, dass 'GeneratedImage' nicht auf eine Instanz eines Objekts gesetzt wird, wenn dieser Prozess beginnt? – devuxer
@DanM natürlich habe ich nicht darüber nachgedacht :) Sie können auch einen Dispatcher über 'Application.Current.Dispatcher' erreichen –
Ich fürchte, das tut es auch nicht. Ich bekomme "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread es besitzt." – devuxer