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

C# Discussion :

ArgumentOutOfRangeException lors d'une action asynchrone


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut ArgumentOutOfRangeException lors d'une action asynchrone
    Bonjour,
    J"utilise l'action asynchrone pour convertir les dates dans mon datatable. Elle fonctionne pour des données d'environ 1000 lignes mais j'obtiens des erreurs quand je travailles sur une grosse données 50000 lignes.

    ArgumentOutOfRangeException
    {"Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"}

    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
    private DataTable convertAODateTime(DataTable excelData, List<ColumnInfo> colInfo)
            {
                for (int i = 0; i < colInfo.Count; i++)
                {
                    if (colInfo[i].type.Equals("DateTime"))
                    {
                        int firstPart = excelData.Rows.Count / 2;
                        Action firstAction = delegate
                        {
                            for (int j = 0; j < firstPart; j++)
                            {
                                excelData.Rows[j][i] = convert(excelData.Rows[j][i].ToString());
                            }
                        };
                        Action secondAction = delegate
                        {
                            for (int k = firstPart; k < excelData.Rows.Count; k++)
                            {
                                excelData.Rows[k][i] = convert(excelData.Rows[k][i].ToString());
                            }
                        };
     
                        IAsyncResult firstHandle = firstAction.BeginInvoke(null, null);
                        IAsyncResult secondHandle = secondAction.BeginInvoke(null, null);
     
                        firstAction.EndInvoke(firstHandle);
                        secondAction.EndInvoke(secondHandle);
                    }
                }
                return excelData;
            }
     
            private string convert(string data)
            {
                double value;
                if (double.TryParse(data, out value))
                {
                    try
                    {
                        data= DateTime.FromOADate(value).ToString();
                    }
                    catch
                    {                    
                    }
                }
     
                return data;
            }
    Qu'est ce qui peut provoquer cette erreur? Est ce la synchronisation lors de la lecture ou l'ecriture dans le datatable?
    merci pour votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Points : 98
    Points
    98
    Par défaut
    http://msdn.microsoft.com/en-us/libr...ollection.aspx

    This type is safe for multithreaded read operations. You must synchronize any write operations.
    En bref, ce n'est probablement une idée fabuleuse de jouer avec les Rows d'un DataTable depuis plusieurs threads.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 217
    Points : 73
    Points
    73
    Par défaut
    Pour y remedier, j'ai utilisé la fonction AcquireWriteLock de la classe ReaderWriterLock.

    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
     private DataTable convertAODateTime(DataTable excelData, List<ColumnInfo> colInfo)
            {
                rwl = new System.Threading.ReaderWriterLock();
                for (int i = 0; i < colInfo.Count; i++)
                {
                    if (colInfo[i].type.Equals("DateTime"))
                    {
                        int firstPart = excelData.Rows.Count / 2;
                        Action firstAction = delegate
                        {
                            for (int j = 0; j < firstPart; j++)
                            {
                                try
                                {
                                    rwl.AcquireWriterLock(100);
                                    excelData.Rows[j][i] = convert(excelData.Rows[j][i].ToString());
                                }
                                finally
                                {
                                    rwl.ReleaseWriterLock();
                                }
                            }
                        };
                        Action secondAction = delegate
                        {
                            for (int k = firstPart; k < excelData.Rows.Count; k++)
                            {
                                try
                                {
                                    rwl.AcquireWriterLock(100);
                                    excelData.Rows[k][i] = convert(excelData.Rows[k][i].ToString());
                                }
                                finally
                                {
                                    rwl.ReleaseWriterLock();
                                }
                            }
                        };
     
                        IAsyncResult firstHandle = firstAction.BeginInvoke(null, null);
                        IAsyncResult secondHandle = secondAction.BeginInvoke(null, null);
     
                        firstAction.EndInvoke(firstHandle);
                        secondAction.EndInvoke(secondHandle);
                    }
                }
                return excelData;
            }
    Ca marche, mais du coup je perds en efficacité car j'ai quasiment le même temps d'exécution que si je n'utilisais pas la methode asynchrone. Est ce une bonne façon de contourner le problème d'ecriture du datatable dans un thread?

Discussions similaires

  1. Message d'attente lors d'une action struts 2
    Par cyclopsnet dans le forum Struts 2
    Réponses: 2
    Dernier message: 13/10/2010, 15h10
  2. [JList] Colorer une ligne lors d'une Action
    Par michaeljeru dans le forum Composants
    Réponses: 2
    Dernier message: 03/03/2009, 21h14
  3. Réponses: 6
    Dernier message: 11/10/2007, 14h13
  4. Réponses: 20
    Dernier message: 12/06/2007, 10h11
  5. [debutant] Cursor d'attente lors d'une action??
    Par fix105 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/06/2006, 09h05

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