我有一个问题已经让我发疯了好几天。我已经尝试了很多来自这个网站和许多其他网站的教程和代码片段。我正在构建一个 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 表达式来做这个 withh begin invoke,但没有成功。任何人都可以请我指出错误或以其他方式提供帮助吗?我真的很感激。PS这是我的第一篇文章,所以如果格式不好,我提前道歉。:)
编辑:所以问题显然出在实例上,所以我做了这样的事情:从我创建 frmDataGrid 类的实例的服务器类,我现在称它为接受 3 个参数的构造函数。frmDataGrid fdg = new frmDataGrid(fileName, 100, 100); 在那个构造函数中,在 frmDataGrid 中,我调用了 verifyUIRequest。但是随后发生了另一个错误,我似乎无法弄清楚。它停在
if (dgvDown.InvokeRequired)
{...
错误如下:“对象引用未设置为对象的实例”,即NullReferenceException。可能是什么错误?