0


我有一个问题已经让我发疯了好几天。我已经尝试了很多来自这个网站和许多其他网站的教程和代码片段。我正在构建一个 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。可能是什么错误?

4

1 回答 1

0

您正在您的方法中创建一个全新的数据网格downloadFile。您应该更新主网格并从您的线程方法调用方法,而不是创建一个在downloadFile方法退出时掉在地板上的新网格。

于 2012-07-09T14:22:08.903 回答