2011-07-07 91 views
2

我有2個線程。 在我的工作線程(不是主線程)中,我創建了一個picturebox數組,有時需要將新的picturebox添加到主窗體,但我無法訪問此窗體。我讀了一些我需要使用invoke方法的地方,但我只知道如何更新一個picturebox或一個標籤。 我不知道如何使用這段代碼做到這一點:線程問題c#

food[x].Location = new Point(100,100); 
food[x].Size = new Size(10,10); 
food[x].BorderStyle = BorderStyle.Fixed3D; 
food[x].ImageLocation = "food.png"; 
this.Controls.Add(food[x]); 
food[x].BringToFront; 

誰能幫助我?

+2

你可能不應該有多個線程。 – SLaks

+4

SLaks是正確的。這聽起來像是一場等待發生的災難。當兩個線程試圖訪問相同的UI元素時,很難獲得UI編程。通常這種工作方式是*只允許UI線程與UI元素交談*。如果您有需要與UI交談的工作線程,那麼您需要爲工作線程設置某種方式來與UI線程交談,然後UI線程將該消息傳遞給UI對象。 –

+0

你是代碼示例還是教程? – Dennis

回答

2

在WinForms中,您應該只有一個UI線程,並且只有該線程才能創建或使用UI組件。

如有必要,可使用BackgroundWorker加載圖像,並將PictureBox創建保留爲BackgroundWorker完成時的UI線程。

1

後臺線程無法訪問主線程擁有的GUI控件。

如果要將信息傳遞給GUI,則線程必須與主線程通信,主線程然後操縱GUI控件。

BackgroundWorker線程提供信號發送主線程的方法。例如,請參閱http://www.dotnetperls.com/backgroundworker

0

如果您使用WPF,我建議使用SynchronazationContext來保存主線程,所有其他線程將使用SynchronazationContext的這個實例來訪問主線程(UI)。你以這種方式使用它(注:我生成這樣做,所有其他方法將訪問此方法來更新UI的方法):

SynchronazationContext ctx = null; 
void DoSomething() 
{ 
    ctx = SynchronazationContext.Current; 
    Thread t = new Thread(new ThreadStart(ThreadProc)); 
    t.Start(); 
} 

//This method run in separate Threads 
void ThreadProc() 
{ 
    //Some algorithm here 

    SendOrPostCallback callBack = new SendOrPostCallback(UpdatePic); 
    ctx.Post(callBack, String.Format("Put here the pic path"); 
} 
void UpdatePic(string _text) 
{ 
    //This method run under the main method 
    //In this method you should update the pic 
} 

在.NET 5.0,你可以調用紀念這個複雜的功能方法async並在調用同步方法時寫入'await' - 將同步方法設置爲異步方法並使用主線程更新UI。

+0

所以我複製這段代碼,然後我添加我的代碼,在updatepix方法中添加一個圖片框?並且我還將path(food.png)放入了線程proc方法中? 感謝所有幫助。這裏3am;) – Dennis

+0

多數民衆贊成是正確的,這就是你應該怎麼做,這樣你可以從其他線程訪問主線程..順便說一句,我現在注意到在我的示例代碼中的錯誤,我很快修復,錯誤是我從DoSomething方法調用UpdatePic方法,請嘗試運行它現在沒有錯誤(我刪除它) – Jacob

+0

所以現在我有一個問題,我得到一個錯誤消息。擴展方法不是在一個靜態類。 對不起 只得到德國的恐怖分子,我希望你知道我的意思。 所以這個問題。' 另外你忘記了一個「(」在ctx.Post(callBack,String.Format(「把這裏的圖片路徑」); – Dennis