我有一個問題,一直在推動我堅持幾天..我已經嘗試了很多教程和代碼片段從這個和許多其他網站。我正在構建一個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中稱爲 「服務器」 一個單獨的類工作。在那裏他們等待傳入連接,並且當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;
}
我試圖這樣做withh開始調用,具有一定的lambda表達式,但沒有succeded。任何人都可以請我指出一個錯誤或以其他方式幫助?我真的很感激。 PS這是我的第一篇文章,所以如果格式不好,我提前致歉。 :)
編輯: 因此,問題顯然是有實例,所以我做了這樣的事情:從服務器類 在那裏我創造我frmDataGrid類的實例,我現在把它的構造函數接受3個參數。 frmDataGrid fdg = new frmDataGrid(fileName,100,100);在該構造函數中,在frmDataGrid中,我調用了verifyUIRequest。但是接着發生了另一個錯誤,我似乎無法弄清楚。它停在
if (dgvDown.InvokeRequired)
{...
誤差是作爲folows: 「對象引用不設置爲一個對象的一個實例」,即NullReferenceException異常。什麼可能是錯誤?
我認爲它可以幫助你分開你的問題。嘗試更新網格而不使用線程,看看它是否工作。之後,嘗試使用線程,但沒有GUI,看看是否有效。從一開始就將它們結合起來很難解決。 – 2012-07-09 14:21:04
嗨Amiram,線程工作正常,他們能夠顯示我mbox時,他們甚至完成我把'verifyUIRequest'方法。此外,數據網格可以直接更新(即使用主線程)。 'downloadFile'中的 – epson121 2012-07-09 14:33:48