Зависает на 3-5 минут компонент DataGridView в Microsoft Visual C# 2008
Формулировка задачи:
Вот в главном классе есть два метода через invoke
В разных потоках они переодически вызываются, и при непонятных обстоятельвах, программа просто берёт и тупо зависает на строчке кода, которая работает с компонентом DataGridView, а именно Table
То есть зависает либо на этом Table.Rows.Add(row); либо на Table.Rows.RemoveAt(i); и через 3-5 минут развисает и продолжает работать как надо.. В чём трабла? В коде логических ошибок нет.. Вот только многопоточность подозреваю и 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; }
}));
}Решение задачи: «Зависает на 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();
}
}
}