如何通过C#中的新线程更新在主线程上创建的DataTable?

时间:2013-09-10 13:11:02

标签: c# winforms gridview

我有一个名为'DTImageList'的全局DataTable和一个名为'uxImageGrid'的XtraGrid。现在有一个名为'prcFillImagesVideosAndFiles'的方法,其中我们从数据库页面中提取图像数据,即一次说500行,我们使用XtraTabControl在网格顶部创建手动页面,具体取决于根据存在的数据总数。搜索。假设我们得到700张图像,那么一次只能加载500张图片,并且会创建2页作为“第1页”,“第2页”。         但是在'prcFillImagesVideosAndFiles'方法中,我们并没有获取实际图像,而只是它的名称,id等。之后我创建了一个新的Thread并调用了一个方法运行器,后者又调用了一个名为'FillImages'的新方法,我在其中查看DTImageList并从后端逐个引入实际图像,并使用此图像更新行,因为XtraGrid开始逐个显示图像。         此过程可以正常工作几分钟,即加载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;

    }

由于 维基

1 个答案:

答案 0 :(得分:0)

您可以在将图像作为数据源传递给uxImageGrid之前尝试插入图像。 将图像列添加到DTImageLis。      DTImageList.Columns.Add(“Image”,typeof(System.Drawing.Image));

根据Name,Id等将图像添加到datatable,并将其绑定到uxImageGrid      uxImageGrid.Datasource = DTImageList;