[英]Change label text and start threads in the same void
我有一個大問題,希望你們能幫助我...
我需要啟動一個名為ListenOnSocket
的Thread
,到目前為止沒有問題。
Thread ListenOnSocket = new Thread(newThreadStart(Form1.ListenOnSocket));
ListenOnSocket.Start();
但是,當我想從ListenOnSocket
更改標簽時,我得到了非靜態字段,方法或屬性的對象引用。
所以通常您會通過這樣做來傳遞標簽
public static void ListenOnSocket(Label lblstatus)
{
//i want to change the label from here.
lblstatus.text = "Hello";
}
但后來我明白了
ListenOnSocket沒有重載匹配我的threadstart中的委托System.Threading.Threadstart。
誰能幫忙,我真的很受困擾,如果沒有太多事情要做,對不起,我是C#的新手。
您可以使用Lambda表達式傳遞參數。
Thread ListenOnSocket = new Thread( () => { Form1.ListenOnSocket(yourParameter); } );
ListenOnSocket.Start();
但是,當執行ListenOnSocket
方法時,您將獲得CrossThreadException
。 因此,您需要使用BeginInvoke
設置標簽文本。
因此,搜索CrossThreadException
以及為什么會得到它。
注意:我不為此編寫示例代碼,因為搜索更有利。
您需要將其編組回UI線程:
public static void ListenOnSocket(Label lblstatus)
{
this.BeginInvoke(new Action(() =>
{
//i want to change the label from here.
lblstatus.text = "Hello";
});
}
看來您實際上可能在這里需要ParameterizedThreadStart。 您將傳遞Label作為其參數。 還需要在UI線程上執行控件更改。
public void DoSomething()
{
// Actually a ParameterizedThreadStart, but you don't need to state this explicitly
//var listenOnSocket = new Thread(new ParameterizedThreadStart(ListenOnSocket));
var listenOnSocket = new Thread(ListenOnSocket);
// Pass the label as the ParameterizedThreadStart parameter
// TestLabel is a label within the form
listenOnSocket.Start(TestLabel);
}
private void ListenOnSocket(object statusLabelObject) // Parameter must be of type Object
{
var statusLabel = statusLabelObject as Label;
if (statusLabel == null)
throw new ArgumentException(@"Parameter must be of type Label", "statusLabelObject");
// Changes to controls must be performed on the UI thread.
BeginInvoke((Action)(() => statusLabel.Text = @"text"));
}
他們在這里的關鍵在於,從后台線程更新UI元素(如標簽)是無效的。
如果您的任務運行時間較長,則可能不想在UI線程上運行該任務,因為它將阻塞。
假設您正在創建線程是因為您的某個東西在UI線程上運行的時間過長,可能值得研究將后台線程對UI線程的調用編組的方式。
有關如何執行此操作的更多信息,請參見如何從C#中的另一個線程更新GUI? 如果要從長時間運行的任務中更新狀態,則可能需要調查后台工作程序: MSDN:如何使用后台工作程序 ,這是一個旨在幫助長時間運行的后台任務的幫助程序類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.