Зависает на 3-5 минут компонент DataGridView в Microsoft Visual C# 2008

Узнай цену своей работы

Формулировка задачи:

Вот в главном классе есть два метода через invoke
        internal void p_Add(String[] p) {
            this.Invoke(new MethodInvoker(delegate() {
                DataGridViewCell[] m = new DataGridViewCell[5];
                for (int i = 0; i < 5; i++) {m[i] = new DataGridViewTextBoxCell(); m[i].Value = p[i];}
                DataGridViewRow row=new DataGridViewRow();
                row.Cells.AddRange(m);
                Table.Rows.Add(row);
            }));
        }
        internal void p_Del(long p) {
            this.Invoke(new MethodInvoker(delegate() {
                for (int i = 0; i < Table.RowCount; i++) if (Table.Rows[i].Cells[0].Value.Equals(Convert.ToString(p))) { Table.Rows.RemoveAt(i); break; }
            }));
        }
В разных потоках они переодически вызываются, и при непонятных обстоятельвах, программа просто берёт и тупо зависает на строчке кода, которая работает с компонентом DataGridView, а именно Table То есть зависает либо на этом Table.Rows.Add(row); либо на Table.Rows.RemoveAt(i); и через 3-5 минут развисает и продолжает работать как надо.. В чём трабла? В коде логических ошибок нет.. Вот только многопоточность подозреваю и Invoke.. Очередь длинная выстраивается.))

Решение задачи: «Зависает на 3-5 минут компонент DataGridView в Microsoft Visual C# 2008»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Web;
using System.Web.Services.Protocols;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Collections;
using System.Runtime.InteropServices;
 
namespace Manunich {
    public partial class Main:Form {
        public static Main main;
        public static HttpServer httpServer;
        Thread thread;
        public Main() {InitializeComponent();}
        private void Form1_Load(object sender, EventArgs e) {
            httpServer = new HttpServer(8080);
            thread = new Thread(new ThreadStart(httpServer.listen)); thread.Start();
        }
        internal void p_Add(String[] p) {
            this.Invoke(new MethodInvoker(delegate() {
                DataGridViewCell[] m = new DataGridViewCell[5];
                for (int i = 0; i < 5; i++) {m[i] = new DataGridViewTextBoxCell(); m[i].Value = p[i];}
                DataGridViewRow row=new DataGridViewRow();
                row.Cells.AddRange(m);
                Table.Rows.Add(row);
            }));
        }
        internal void p_Del(long p) {
            this.Invoke(new MethodInvoker(delegate() {
                for (int i = 0; i < Table.RowCount; i++) if (Table.Rows[i].Cells[0].Value.Equals(Convert.ToString(p))) { Table.Rows.RemoveAt(i); break; }
            }));
        }
        internal void p_Edit(long p,String d,String c) {
            this.Invoke(new MethodInvoker(delegate() {
                for (int i = 0; i < Table.RowCount; i++) if (Table.Rows[i].Cells[0].Value.Equals(Convert.ToString(p))) {
                    Table.Rows[i].Cells[4].Value = d;
                    Table.Rows[i].Cells[5].Value = c+" Кб/Сек";
                    break; 
                }
            }));
        }
    }
    public class HttpProcessor {
        static int BUF_SIZE = 65536;
        public long numOfCon = 0;
        public TcpClient socket;
        Stream iS;
        BufferedStream oD;
        String res;
        long len = 0,speed=0;
        public String client_ip;
        public HttpProcessor(TcpClient s,long numOfCon, string client_ip) {
            this.socket = s;
            this.numOfCon = numOfCon;
            this.client_ip = client_ip;
        }
        static string FSF(long size) {string s=""+size;for(int i = s.Length-3; i>0; i-=3) s = s.Insert(i, " ");return s;}
        public void timer() {
            while (len > 0) {
                Main.main.p_Edit(numOfCon, FSF(len), FSF((speed - len) / 1024));
                speed = len;
                Thread.Sleep(1000);
            }
        }
        public void process() {
            iS = new BufferedStream(socket.GetStream());
            oD = new BufferedStream(socket.GetStream());
            try {
                //Добавляем строку запроса в таблицу
                Main.main.p_Add(new String[] { Convert.ToString(numOfCon), res, client_ip, FSF(iS.Length), FSF(iS.Length)});
                    len=iS.Length;
                    byte[] buf = new byte[BUF_SIZE];
                    //Запускаем новый поток, который раз в секунду обновляет в таблице скорость отправки данных
                    new Thread(new ThreadStart(timer)).Start(); speed = len;
                    while (len > 0) {
                        int numread=iS.Read(buf, 0, (int)Math.Min(BUF_SIZE, len));
                        if (numread==0) if (len == 0) break; else throw new Exception("Ошибка считывания локальных данных");
                        len -= numread;
                        oD.Write(buf, 0, numread);
                        oD.Flush();
                    }
                    Thread.Sleep(20);
                    oD.Close();
            }
            catch (Exception e) {Main.main.Logging(e.Message,this);}
            if (fs!=null) fs.Close();
            iS=null;oD=null;fs=null;
            len = 0;
            Main.main.p_Del(numOfCon);//Удаляем из таблицы
        }
    }
    public class HttpServer {
        static long numOfCon = 0;
        static IPAddress ipadr = new IPAddress(new byte[] {0,0,0,0});
        protected int port;
        public TcpListener listener;
        public HttpServer(int port) { this.port = port; }
        public void listen() {
            listener = new TcpListener(ipadr, port);
            listener.Start();
            while (true) {
                TcpClient s = listener.AcceptTcpClient();
                numOfCon++;
                HttpProcessor processor = new HttpProcessor(s, numOfCon, s.Client.RemoteEndPoint.ToString());
                Thread thread = new Thread(new ThreadStart(processor.process));
                thread.Start();
            }
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5