尋求一般幫助理解這個程序流程: 在窗戶那爲什麼當我調用一個新的線程中的一個方法,該線程不構成應用在繼續執行之前等待該方法完成?方法稱爲線程中意外順序(C#.NET)執行
默認情況下異步執行的線程中調用的方法? (我希望程序阻塞,直到方法完成而不必使用下面的Thread.Sleep行)。下面的「Thread.Sleep」一行的評論可能有助於進一步澄清我的問題。 - 謝謝!
private void button1_Click(object sender, EventArgs e)
{
//Call doStuff in new thread:
System.Threading.Thread myThread;
myThread = new System.Threading.Thread(new System.Threading.ThreadStart(doStuff));
myThread.Start();
}
private void doStuff()
{
//Instantiate external class used for threadSafe interaction with UI objects:
ThreadSafeCalls tsc = new ThreadSafeCalls();
int indx_firstColumn = 0;
//Loop 3 times, add a row, and add value of "lastRowAdded" to column1 cell.
for (int a = 0; a < 3; a += 1)
{
tsc.AddGridRow(dataGridView1); //Call method to add a row to gridview:
Thread.Sleep(1000); // Why does the execution of the line above go all crazy if I don't pause here? It's executing on the same thread, shouldn't it be synchronous?
tsc.AddGridCellData(dataGridView1,indx_firstColumn, tsc.lastRowAdded,tsc.lastRowAdded.ToString()); //Add value of "lastRowAdded" (for visual debugging)
}
內容的 「ThreadSafeCalls」 類:
public int lastRowAdded = -999;
public void AddGridRow(DataGridView gv)
{
if (gv.InvokeRequired)
{
gv.BeginInvoke((MethodInvoker)delegate()
{
lastRowAdded = gv.Rows.Add();
});
}
else
{
lastRowAdded = gv.Rows.Add();
}
}
public void AddGridCellData(DataGridView gv, int column, int rowID, string value)
{
//Thread safe:
if (gv.InvokeRequired)
{
gv.BeginInvoke((MethodInvoker)delegate() { gv.Rows[rowID].Cells[column].Value = value + " "; });
}
else
{
gv.Rows[rowID].Cells[column].Value = value;
}
}
你確實需要爲我們提供[mcve]。我試圖複製你的問題,但不能。代碼中可能會出現一些我們無法看到的情況。 – Enigmativity