IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

Accès inter-threads non valide et BitmapImage


Sujet :

Silverlight

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut Accès inter-threads non valide et BitmapImage
    Bonjour à vous tous,

    J'ai une méthode qui redimensionne des images à l'aide du contrôle RadUpload de telerick et lorsque je tente de téléverser sur mon server 3 ou 4 images, les dernières avortent (voir l'image ci-jointe) avec le message
    Accès inter-threads non valide
    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BitmapImage bmp = new BitmapImage();
    (voir en gras et italique dans le code qui suit).

    Par ailleurs, les premières images sont ok.

    J'ai lu ceci (http://stackoverflow.com/questions/1...d-access-issue) mais je ne vois pas comment traiter mon image différemment. Une idée serait appréciée. De plus, cela marche pour les premières images chargent mais plate pour la dernière (et en plus elle n'est pas redimensionnée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    private void RadUploadPhotosEspaceClos_FileUploadStarting(object sender, Telerik.Windows.Controls.FileUploadStartingEventArgs e)
    {
    RadUploadSelectedFile file = e.SelectedFile as RadUploadSelectedFile;
    WriteableBitmap wb;
     
    // Redimensionner l'image
    using (Stream stream = file.File.OpenRead())
    {
        wb = ResizeImage(stream, 500); //resize the image to 500 pix
    }
     
    byte[] buffer;
    using (Stream Source = JpgEncoder.Encode(wb, 80))
    {
        int bufferSize = Convert.ToInt32(Source.Length);
        buffer = new byte[bufferSize];
        Source.Read(buffer, 0, bufferSize);
    }
     
    //NOTE: use the buffer to show the image...
    e.NewFileStream = new MemoryStream(buffer);
    }
     
    private WriteableBitmap ResizeImage(Stream stream, double targetSize)
    {
    BitmapImage bmp = new BitmapImage();
     
    bmp.SetSource(stream);
    System.Windows.Controls.Image img = new System.Windows.Controls.Image();
    img.Source = bmp;
    double scaleX = 1;
    double scaleY = 1;
     
    if (bmp.PixelHeight > targetSize)
        scaleY = targetSize / bmp.PixelHeight;
    if (bmp.PixelWidth > targetSize)
        scaleX = targetSize / bmp.PixelWidth;
     
     
    double scale = Math.Min(scaleY, scaleX);
     
    int newWidth = Convert.ToInt32(bmp.PixelWidth * scale);
    int newHeight = Convert.ToInt32(bmp.PixelHeight * scale);
    WriteableBitmap result = new WriteableBitmap(newWidth, newHeight);
    result.Render(img, new ScaleTransform() { ScaleX = scale, ScaleY = scale });
    result.Invalidate();
    return result;
    }
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Et donc est-ce que tu as essayé d'entouter ton code avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    this.Dispatcher.BeginInvoke(() =>
    {
     
    });
    ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut
    Un grand merci Skyounet pour le BeginInvoke.

    J'ai essayé mais je vois avec une trace que la méthode continue son chemin après l'appel avec BeginInvoke. Il faudrait peut-être utiliser Invoke ca je veux stopper le traitement qui suit et obtenir le redimensionnement de mon image avant tout.

    Suggestion pour utiliser Invoke?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    BeginInvoke te permet de faire des appels asynchrones tandis que Invoke c'est pour des appels synchrones.
    Donc si tu veux attendre que le traitement de ton delegate se termine avant de poursuivre alors je pense que la méthode Invoke c'est mieux pour toi.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut
    Merci h2s84 pour ta réponse et les liens.

    Par ailleurs, je tente d'utiliser Invoke et VS 2010 (C#) semble reconnaître seulement this.Dispatcher.BeginInvoke.

    Intellisense n'affiche pas Invoke en dépit de mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Windows.Threading;

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est normal, vu qu'avec Silverlight, les appels doivent tous asynchrones (choix de Microsoft) pour ne pas freezer l'UI.

    Donc t'es obliger BeginInvoke au lieu de Invoke.

    Peut on voir le ton code complete à partir de la ligne où tu fais appel au BeginInvoke. En gros le contenu de ton delegate :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    this.Dispatcher.BeginInvoke(() =>
    {
     
    //Tout ce qui trouve ici.
     
    });

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Par défaut
    Merci beaucoup. Je vais continuer mes recherches dans un autre sens alors.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/03/2014, 19h53
  2. Réponses: 2
    Dernier message: 29/08/2011, 09h17
  3. Opération inter-threads non valide VB.NET
    Par airemax dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/05/2011, 11h51
  4. Opération inter-threads non valide
    Par nakk01 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/05/2009, 01h43
  5. Erreur : Opération inter-threads non valide
    Par cadeau dans le forum C++/CLI
    Réponses: 1
    Dernier message: 12/12/2006, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo