我有一个问题一直让我疯了几天..我已经尝试过很多来自这个和许多其他网站的教程和代码片段。我正在构建一个P2P应用程序,我在访问主线程时遇到了问题
以下是我申请的简单流程:
1.显示frmMain - 用户点击登录按钮
2.显示frmlogin - 用户输入他的名字
3.“登录”后 - 创建两个线程(threadTCPlistener和threadUDPlistener)
4. frmDataGrid显示为
Server listen = new Server();
Thread listeningUDPThread = new Thread(new ThreadStart(listen.startUDPServer));
listeningUDPThread.IsBackground = true;
listeningUDPThread.Start();
Thread listeningTCPThread = new Thread(new ThreadStart(listen.startTCPServer));
listeningTCPThread.IsBackground = true;
listeningTCPThread.Start();
frmDataGrid dg = new frmDataGrid();
dg.Show();
5.Threads在一个名为“Server”的单独类中工作。在那里,他们等待传入连接,当TCP线程接受连接时,它开始接收文件。收到文件后,我想更改frmDataGrid中的GUI以向网格视图添加新行。我做过这样的事情:
public void downloadFile()
{
//--receiving of the file--
frmDataGrid fdg = new frmDataGrid();
//filename is the name of received file, and 100's are just for testing (for now).
fdg.verifyUIRequest(fileName, 100, 100);
}
我正在调用frmDataGrid VerifyUIRequest中的方法,如下所示:
public void verifyUIRequest(string filename, int done, int percent)
{
if (dgvDown.InvokeRequired)
{
dgvDown.Invoke((MethodInvoker)delegate { updateDownDgv(filename, done, percent); });
}
else
{
updateDownDgv(filename, done, percent);
}
在此之后,主线程应调用“updateDownDgv”方法,但问题是我的数据网格没有发生任何事情。以下是更新代码:
public void updateDownDgv(string filename, int done, int percent)
{
foreach (DataGridViewRow r in dgvDown.Rows)
{
if ((string)r.Cells[0].Value == filename)
{
r.Cells[1].Value = done;
r.Cells[2].Value = percent;
}
dgvDown.Invalidate();
return;
}
DataTable tab = (DataTable)dgvDown.DataSource;
DataRow row = tab.NewRow();
row[0] = filename;
row[1] = percent;
row[2] = done;
//MessageBox.Show(done.ToString());
tab.Rows.Add(row);
dgvDown.DataSource = null;
dgvDown.DataSource = tab;
}
我已尝试使用一些lambda表达式开始调用,但没有成功。任何人都可以指出我的错误或以其他方式帮助?我真的很感激。 PS这是我的第一篇文章,所以如果格式不好,我会提前道歉。 :)
编辑: 所以问题显然是实例,所以我做了这样的事情: 从我创建我的frmDataGrid类的实例的Server类,我现在称它为带有3个参数的构造函数。 frmDataGrid fdg = new frmDataGrid(fileName,100,100); 在那个构造函数中,在frmDataGrid中,我调用了verifyUIRequest。但是又发生了另一个错误,我似乎无法弄明白。它停在
if (dgvDown.InvokeRequired)
{...
错误如下: “对象引用未设置为对象的实例”,即NullReferenceException。可能是什么错误?
答案 0 :(得分:0)
您正在downloadFile
方法中创建全新的数据网格。你应该从你的线程方法更新主网格和调用方法,而不是在downloadFile
方法退出时创建一个新的网格。