J'ai un thread d'arrière-plan qui génère une série d'objets BitmapImage
. Chaque fois que le thread d'arrière-plan finit de générer un bitmap, je voudrais montrer cette image à l'utilisateur. Le problème est de savoir comment passer le BitmapImage
du thread d'arrière-plan au thread de l'interface utilisateur.Comment transmettre un bitmapImage d'un thread d'arrière-plan au thread d'interface utilisateur dans WPF?
Ce projet est MVVM, donc mon avis a un élément Image
:
<Image Source="{Binding GeneratedImage}" />
Mon point de vue-modèle a une propriété GeneratedImage
:
private BitmapImage _generatedImage;
public BitmapImage GeneratedImage
{
get { return _generatedImage; }
set
{
if (value == _generatedImage) return;
_generatedImage= value;
RaisePropertyChanged("GeneratedImage");
}
}
Mon point de vue-modèle a également le code crée le fil d'arrière-plan:
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?
}
}
J'aimerais passer en quelque sorte backgroundThreadImage
au thread UI, où il deviendra uiThreadImage
, puis définissez GeneratedImage = uiThreadImage
pour que la vue puisse être mise à jour. J'ai regardé quelques exemples traitant du WPF Dispatcher
, mais je n'arrive pas à trouver un exemple qui résout ce problème. S'il vous plaît donnez votre avis.
Ceci est utile, Simon, merci. Mais comment contourner le fait que, lorsque ce processus commence, 'GeneratedImage' n'est pas défini sur une instance d'un objet? – devuxer
@DanM bien sûr je n'ai pas pensé à ça :) Vous pouvez également obtenir un Dispatcher via 'Application.Current.Dispatcher' –
J'ai peur que cela ne le fasse pas non plus. Je reçois "Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède." – devuxer