0

「DTImageList」という名前のグローバル DataTable と「uxImageGrid」という名前の XtraGrid があります。現在、「prcFillImagesVideosAndFiles」という名前のメソッドがあり、データベース ページごとに画像データを取得します。つまり、一度に 500 行とします。存在するデータの総数に応じて、XtraTabControl を使用してグリッドの上に手動ページを作成します。探す。たとえば、700 個の画像を取得した場合、一度に 500 個しか読み込まれず、「ページ 1」、「ページ 2」として 2 ページが作成されます。しかし、「prcFillImagesVideosAndFiles」メソッドでは、実際の画像を取得するのではなく、その名前、ID などのみを取得します。この後、新しいスレッドを作成し、「FillImages」という新しいメソッドを呼び出すメソッド ランナーを呼び出します。DTImageList を見て、バックエンドから実際の画像を 1 つずつ取得し、この画像で行を更新します。これにより、XtraGrid が画像を 1 つずつ表示し始めます。このプロセスは数分間正常に機能します。つまり、20 ~ 25 個のイメージをロードすると、「クロススレッド操作が無効です」というエラーが表示されます。

// 私の prcFillImagesVideosAndFiles メソッドのコードは次のとおりです。

`if (DTImageList != null)
                {
                    DTImageList.Rows.Clear(); DTImageList.Columns.Clear(); DTImageList = null;
                }

                string sql = @"select " + top + @" IM.Image_ID,IM.extension,IM.Is_Uploaded,cast(0 as varbinary) 'ActualImage',IM.description 'Description',IM.ContentType,IM.DateTime_Uploaded,IM.FolderName, '' as FilePath 
                           from images as IM where IM.GCRecord is null and IM.Is_Uploaded=1 " + MainCriteria + @" " + Ob + @"";

                string sql1 = LayoutPaging(sql);
                DTImageList = new DataTable();
                DTImageList = FillDataTable(sql1);
                DataTable DTdeliv2 = new DataTable();
                DTdeliv2.Columns.Add("Image");
                DTdeliv2.Columns.Add("UniqueNumber");
                DTdeliv2.Columns["Image"].DataType = typeof(Image);
                DTdeliv2.Columns["UniqueNumber"].DataType = typeof(int);
                DTImageList.Merge(DTdeliv2, true, MissingSchemaAction.Add);

                uxImageGrid.DataSource = null;
                uxImageGrid.DataSource = DTImageList;

                RepositoryItemTextEdit riTextEdit = new RepositoryItemTextEdit();
                riTextEdit.Appearance.TextOptions.HAlignment = HorzAlignment.Center;
                layoutView1.Columns["Description"].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center;

                riTextEdit.Appearance.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
                riTextEdit.Appearance.Options.UseBackColor = true;
                riTextEdit.NullText = "";
                uxImageGrid.RepositoryItems.Add(riTextEdit);
                layoutView1.Columns["Description"].ColumnEdit = riTextEdit;
                riTextEdit.Leave += new EventHandler(riTextEdit_Leave);
                riTextEdit.KeyPress += new KeyPressEventHandler(riTextEdit_KeyPress);

                RepositoryItemPictureEdit riPictureEdit = new RepositoryItemPictureEdit();

                riPictureEdit.SizeMode = PictureSizeMode.Zoom;
                riPictureEdit.ShowMenu = false;
                riPictureEdit.NullText = "        Loading Image";
                riPictureEdit.Appearance.Image = Pionero.RetailTherapy.Properties.Resources.mag;


                uxImageGrid.RepositoryItems.Add(riPictureEdit);
                layoutView1.Columns["Image"].ColumnEdit = riPictureEdit;

                riPictureEdit.MouseMove += new MouseEventHandler(riPictureEdit_MouseMove);
                riPictureEdit.MouseDown += new MouseEventHandler(riPictureEdit_MouseDown);

                layoutView1.Columns["Image"].Caption = "";

                int k = DTImageList.Rows.Count;
                if (k > 0)
                {
                    DevExpress.Data.Filtering.CriteriaOperator expr1 = new DevExpress.Data.Filtering.BinaryOperator("Is_Uploaded", true);
                    layoutView1.ActiveFilterCriteria = expr1;
                    if (pthread != null)
                    {
                        StopRunningThread();
                    }
                    if (pthread == null || pthread.IsAlive==false)
                    {
                        pthread = new Thread(new ThreadStart(runner));
                        pthread.IsBackground = true;
                        Is_ThreadNeededtoWork = true;
                        pthread.Start();
                    }
                    else
                    {

                        Is_ThreadNeededtoWork = true;
                        pthread.Start();
                    }

                }`

//ランナーメソッドは次のとおりです。

 void runner()
    {
        if (Is_ThreadNeededtoWork == false)
        {
            if (dtImages != null)
            {
                dtImages.Rows.Clear(); dtImages.Columns.Clear(); dtImages = null;
            }
            return;
        }
            if (Is_ThreadNeededtoWork == true)
            {
                FillImages();
            }
    }

// FillImages メソッドのコードは次のとおりです。

try
        {
            if (DTImageList.Rows.Count <= 0) return;
            StringBuilder sbImagesNotLoaded = new StringBuilder();
            sbImagesNotLoaded.Append("Following images not loaded due to connection: ");
            ArrayList lstImage_IDs = new ArrayList();
            int NoOfAttempts = 0;

            //if (dtImages != null)
            //{
                for (int i = 0; i < DTImageList.Rows.Count; i++)
                {
                    NoOfAttempts = 0;
                V:
                    string Qry = @" Select Image_ID,image from images where Image_ID = " + DTImageList.Rows[i]["Image_ID"].ToString();
                    dtImages = FillDataTable(Qry);

                    if (dtImages != null && dtImages.Rows.Count > 0)
                    {
                        if (DTImageList.Rows[i]["image"] == DBNull.Value)
                        {
                           // Thread.Sleep(100);
                            byte[] barr = (byte[])dtImages.Rows[0]["image"];
                            Image img = Global.byteArrayToImage(barr);
                            DTImageList.Rows[i]["Image"] = img;
                            DTImageList.AcceptChanges();
                            uxImageGrid.RefreshDataSource();
                        }
                    }
                    else
                    {
                       // Thread.Sleep(100);
                        if (Convert.ToInt32(DTImageList.Rows[i]["Image_ID"]) > 0)
                            if (NoOfAttempts < 3)
                            {
                                NoOfAttempts = NoOfAttempts + 1;
                                goto V;
                            }
                            else
                            {
                                if (lstImage_IDs.Count > 0)
                                    sbImagesNotLoaded.Append("," + Convert.ToString(DTImageList.Rows[i]["Description"]));
                                else
                                    sbImagesNotLoaded.Append(Convert.ToString(DTImageList.Rows[i]["Description"]));

                                lstImage_IDs.Add(DTImageList.Rows[i]["Image_ID"]);

                            }
                    }

                }



            //}

            if (lstImage_IDs.Count > 0)
            {
                for (int i = 0; i < lstImage_IDs.Count; i++)
                {
                    DataRow drImage = DTImageList.Select("Image_ID=" + Convert.ToString(lstImage_IDs[i]) + "").FirstOrDefault();
                    if (drImage != null)
                        DTImageList.Rows.Remove(drImage);
                }
                DTImageList.AcceptChanges();

                XtraMessageBox.Show(sbImagesNotLoaded.ToString(), Global.Header, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            EnableDisablePanelControls(true);
            if (pthread != null)
            {
                Is_ThreadNeededtoWork = false;
                StopRunningThread();
            }

        }
        catch (ThreadAbortException abortException)
        {

        }
        catch (Exception emmp)
        {
            EnableDisablePanelControls(true);
            //pthread.Abort();

        }
        finally
        {
            //Global.StopProg();
        }

//StopRunningThread() のコードは次のとおりです。

 void StopRunningThread()
    {
        if (dtImages != null)
        {
            dtImages.Rows.Clear(); dtImages.Columns.Clear(); dtImages = null;
        }

        Is_ThreadNeededtoWork = false;

    }

ありがとうヴィッキー

4

1 に答える 1